mysql - почему этот подзапрос по предложениям WHERE работает? - PullRequest
1 голос
/ 02 апреля 2019

мой столик с фильмами здесь,

title        year length incolor studioName producerC#

Avengers        2012    142 1   Marvel      12345
First Avenger   2011    123 1   Marvel      38664 
Justice League  2017    121 1   DC          11223 
Man of Steel    1925    142 1   DC          38664 
Man of Steel    2013    142 1   DC          11223 
Ted             2012    106 1   Universal   87654 
Toy Story 3     2010    102 1   Pixar       23456

и я хочу найти «названия, которые использовались для двух или более фильмов».

ответ - «Человек из стали», потому что этот фильм 1925, 2013, поэтому его использовали дважды.

и мой запрос здесь.

select distinct movie.title 
from movie, (select * from movie) as temp
where temp.title = movie.title 
    AND (temp.year != movie.year OR temp.length != movie.length OR temp.studioName != movie.studioName);

как уважение, результат - Man of Steel что я хочу.

но я не понимаю разницы во времени, фильм.

обе таблицы имеют абсолютно одинаковое значение , поэтому temp.title = movie.title должно быть select title from movie;

и temp.year != movie.year должны быть равны нулю, поскольку temp.year != movie.year совпадает с select year from movie where movie.year != movie.year

но результат «Человек из стали», и я не могу понять, что я пропустил.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

Ваш текущий запрос неоптимален. Вы должны переписать его, используя явные объединения, в данном случае явное самостоятельное соединение:

SELECT DISTINCT
    m1.title
FROM movie m1
INNER JOIN movie m2
    ON m1.title = m2.title
WHERE
    m1.year <> m2.year OR m1.length <> m2.length OR m1.studioName <> m2.studioName;

Логика здесь заключается в рассмотрении каждой пары фильмов, которые имеют одинаковое название, но , а не , разделяют либо год, длину или название студии. То есть найдите все заголовки фильмов так, чтобы существовал другой фильм с таким же названием, но одно или несколько других полей отличаются.

Существует еще один способ написать запрос с использованием агрегации по названию фильма:

SELECT title
FROM movie
GROUP BY title
HAVING
    MIN(year) <> MAX(year) OR
    MIN(length) <> MAX(length) OR
    MIN(studioName) <> MAX(studioName);
2 голосов
/ 02 апреля 2019

В вашем запросе и Temp, и Movie - это те же самые таблицы, и цель этого объединения в других терминах SELF JOIN состоит в том, чтобы сопоставить два заголовка фильма, в то время как хотя бы одна из других характеристик отличается, это может быть Year, Length Or Название студии. Вот почему он указан в операторе WHERE с неравным обозначением в OR Условие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...