SQL-запрос Найдите элемент, соответствующий критериям

#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 что:

  1. представленные фильмы все отличаются от этого ff.ISAN <> f.ISAN
  2. и у них та же песня, что и в этом фильме ff.IRSC = f.IRSC
  3. и появляется по крайней мере в 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() .