#mysql #sql
Вопрос:
Я работаю в базе данных фильмов для проекта, и мне нужно сделать запрос о поиске фильма, в котором используются 3 или более песен, которые использовались в другом фильме. Мой стол следует за следующим сквемом:
ISAN IRSC
1 1
1 2
1 3
2 2
2 3
3 4
4 5
4 3
. .
. .
. .
ISAN-это код, идентифицирующий фильм, а IRSC-код, идентифицирующий песню.
В качестве примера:
ISAN IRSC
1 1
Означает, что фильм, код которого один, использует песню, код которой один.
Я хотел бы знать запрос, который я должен выполнить в Mysql.
Заранее спасибо!
Комментарии:
1. Можете ли вы предоставить запросы, которые вы пробовали, но которые не сработали, чтобы у нас была отправная точка для того, чтобы помочь?
2. мне нужно сделать запрос о поиске фильма, в котором используются 3 или более песен, использованных в другом фильме. Могу ли я сказать, что вам нужны пары фильмов, в которых есть по крайней мере 3 общие песни?
Ответ №1:
SELECT t1.ISAN ISAN1,
t2.ISAN ISAN2,
GROUP_CONCAT(DISTINCT IRSC) common_songs_list,
COUNT(DISTINCT IRSC) common_songs_amount
FROM films t1
JOIN films t2 USING (IRSC)
WHERE t1.ISAN < t2.ISAN
GROUP BY t1.ISAN, t2.ISAN
HAVING common_songs_amount >= 3;
Комментарии:
1. Большое спасибо, это было именно то, что я искал 🙂
Ответ №2:
Мэб, что-то вроде этого могло бы сделать эту работу:
select f.ISAN, f.IRSC
from films f
where exists (
select 1
from films ff
where ff.ISAN <> f.ISAN
and ff.IRSC = f.IRSC
group by ff.IRSC
having count(*) >= 3
)
С помощью этого запроса вы проверяете, exists
что:
- представленные фильмы все отличаются от этого
ff.ISAN <> f.ISAN
- и у них та же песня, что и в этом фильме
ff.IRSC = f.IRSC
- и появляется по крайней мере в 3 фильмах
count(*) >= 3
Комментарии:
1. Спасибо @Akina, ты была права. Насчет того
distinct
, я не думаю, что это меняет результат, я предполагаю, что не может быть 2 фильма с одинаковымиISAN
и одинаковымиIRSC
Ответ №3:
Я работаю в базе данных фильмов для проекта, и мне нужно сделать запрос о поиске фильма, в котором используются 3 или более песен, которые использовались в другом фильме.
Я интерпретирую это так, как будто в фильме есть песни. У каждой из этих песен есть количество фильмов, то есть количество фильмов, в которых появляется песня. Это касается фильмов, в которых количество фильмов превышает 1 по крайней мере в трех фильмах. Это равносильно утверждению, что три песни появились по крайней мере в одном другом фильме.
Я думаю, что самостоятельное присоединение — это прекрасный подход. Однако логика была бы:
select fs.isan, count(*)
from film_songs fs join
film_songs fs2
on fs.isrc = fs2.isrc and
fs.isan <> fs2.isan
group by fs.isan
having count(distinct isrc) >= 3;
Если вам нужен список песен или «других фильмов», вы можете использовать group_concat()
.