Запрос MySQL к одной таблице для поиска нескольких строк

#mysql #database

#mysql #База данных

Вопрос:

Я пытаюсь найти способ поиска общих титров двумя людьми в базе данных фильмов, например:

таблица: ‘титры’
столбцы: ‘идентификатор’, ‘фильм’, ‘персона’

Моя другая проблема в том, что у человека может быть несколько титров для одного и того же фильма, так как же мне отфильтровать дубликаты? Будем признательны за любую помощь. На данный момент у меня есть следующее. Я на правильном пути?

 SELECT DISTINCT movie
FROM credits
WHERE person = 'condition1' OR person = 'condition2'
GROUP BY movie
HAVING COUNT(*)=2
  

Комментарии:

1. какой результат вы получаете при выполнении вашего запроса?

2. DISTINCT является избыточным, если вы ГРУППИРУЕТЕ ПО. Что касается дубликатов, почему бы вам не установить УНИКАЛЬНЫЙ КЛЮЧ для movie person?

3. @Capsule Потому что это не уникально по описанию OP 🙂

4. @Emmerman ну, согласно описанию таблицы (никаких других полей, кроме id / movie / person), movie person должны быть уникальными (я говорю об одном уникальном ключе в обоих столбцах одновременно, а не о 2 уникальных ключах).

5. @Capsule Я думаю, что есть еще столбцы (что-то вроде role — редактор, актер, продюсер и т.д.)

Ответ №1:

 SELECT DISTINCT c1.movie
FROM credits AS c1
JOIN credits AS c2 on (c1.movie = c2.movie)
WHERE c1.person = 'john'
AND c2.person = 'kate'
  

Комментарии:

1. Кстати о скорости… перенос WHERE условий в JOIN был бы быстрее, но, тем не менее, это правильный ответ.

2. Да, это отлично сработало, но, как рекомендовал Narf, объединение выполняется быстрее, как GordonM, опубликованный ниже. Не представлял, что вы можете объединить таблицу саму по себе … newb ->

3. @Stephen вы не рассчитали время, это идентичное объединение.

Ответ №2:

Это должно сработать:

 SELECT DISTINCT movie
FROM (
      SELECT movie, COUNT(person) AS contributors
      FROM credits
      WHERE person IN('person1','person2')
      GROUP BY movie, person
      HAVING contributors>1
     ) t1
  

Комментарии:

1. -1 очень медленный запрос, group by movie, person должен быть, group by person тогда select distinct movie может быть просто select movie . Конечно, подсчет все равно будет замедляться.

2. GROUP BY person выдаст неверные результаты, когда есть человек, который имеет два вклада в один и тот же фильм. Это может быть медленно для таблицы с миллионами строк, но я никогда не говорил, что это быстро, и вы просто пытаетесь найти оправдание, чтобы отдать отрицательные голоса всем, кто пытается помочь (кроме вас самих, конечно …), что является чистым троллингом.

3. просматривая ответы, я понимаю вашу точку зрения. Скорость действительно не была обязательным требованием, и ваш ответ действительно дает правильный результат.

4. @Johan, меня действительно не волнуют голоса, ни один из них не испортит мою «репутацию» или что-то в этом роде. Я никогда не тестировал это в любом случае… так что это тоже может быть неверно. Я просто хотел высказать свою точку зрения, и поскольку вы ее поняли… меня это устраивает.

Ответ №3:

 select distinct cr1.movie
from credits as cr1
join credits as cr2
using (movie)
where cr1.person = {person 1 goes here}
and cr2.person = {person 2 goes here}
  

Комментарии:

1. -1 не сработает, потому что вы присоединяетесь по уникальному идентификатору, выдавая пустой get, потому что в кредите с одинаковым идентификатором не может быть 2 человек.

2. Спасибо. Это отлично работает и, похоже, является самым быстрым решением. Ты меня бесишь. Я только что описался. Буквально.

Ответ №4:

Вам это не нужно HAVING COUNT(*)=2 . Он выдает вам только фильмы с двумя совпадениями (один человек с двумя титрами или с обоими condition1 и condition2 ). Более того — вам вообще не нужно group by использовать distinct (в данном случае).

 SELECT DISTINCT movie
FROM credits
WHERE person = 'condition1' OR person = 'condition2'
  

Комментарии:

1. @Johan согласился. Ошибка shared в вопросе (все еще плохо с английским)