2015-04-20 4 views
-1

Учитывая следующее отношение movie {country,major_genre,production_year, run_time, title, я бы хотел перечислить все страны, кроме Испании, фильмы, созданные в этой стране, при условии, что их не менее двух.SQL In и having-clause, почему они дают разные результаты?

Я написал два запроса, и они каким-то образом дали разные результаты. Кажется, что первый из них правильный, но мне кажется, что они равны. Я изучаю SQL. Может кто-то, пожалуйста, помогите объяснить различия? Спасибо за вашу помощь!

Первый:

SELECT m1.country, m1.production_year, m1.title 
FROM movie m1 
WHERE m1.country <> "Spain" 
AND m1.country 
IN (
    SELECT m2.country 
    FROM movie m2 
    GROUP BY m2.country  //select only the ones with at least 2 movies 
    HAVING COUNT(*) >=2 
) 
ORDER BY m1.country ASC , m1.production_year DESC 

И второе:

SELECT m1.country, m1.production_year, m1.title 
FROM movie m1 
WHERE m1.country <> "Spain" 
GROUP BY m1.country 
HAVING COUNT(*) >=2 //the country selected should have count of at least 2 rows 
ORDER BY m1.country ASC , m1.production_year DESC 
+1

Мой самый первый вопрос, ли вторая работа запрос? – Backtrack

+2

Похож на запрос MySQL, который расслаблен относительно правил, связанных с предложением GROUP BY. FYI, второй запрос неверен, так как вы должны перечислить все столбцы в предложении GROUP BY, которые находятся в списке SELECT. – cha

+0

Я вижу «m1.country, m1.production_year, m1.title» в инструкции select, но в то время как в группе у вас есть только m1.country – Backtrack

ответ

1

Проблема заключается в том, что второй запрос использует GROUP BY на одном столбце, но возвращает 3 колонки. Поэтому каждая страна с> 1 фильмом выходит один раз, со «случайным» значением для года и фильма (на самом деле это не случайно).

Вы также можете сделать это без GROUP BY:

SELECT m1.country, m1.production_year, m1.title 
FROM movie m1 
WHERE m1.country <> "Spain" 
AND 1 < (
    SELECT count(*) 
    FROM movie m2 
    WHERE m2.country = m1.country 
) 
ORDER BY m1.country ASC , m1.production_year DESC 

Вот скрипку: http://sqlfiddle.com/#!9/e2ddc/2

+0

Спасибо! Но я пытаюсь понять, почему второй не работает. Даже после добавления команды m1.country, m1.production_year, m1.title' в GROUP BY, она по-прежнему неверна. – user3735871

+1

Поскольку 'COUNT (*)' применяется ко всем столбцам в 'GROUP BY'. Итак, в вашем исходном 2-м запросе вы задаете _summarize по странам и сохраняете только страны с> 1 в группе, а затем добавляете год и название откуда-то. Вот почему это не работает. Вы уже суммировали строки по одному на страну, поэтому не можете вернуться к тому, чтобы иметь несколько на страну. – Turophile

+1

Если вы запросите больше столбцов «GROUP BY», 'COUNT (*)' больше не будет того, что вы хотите, потому что вы рассчитываете годы и названия. Вы не можете обе группы (по странам) и включать вещи (год, название), которые вы игнорируете для группы за один шаг. – Turophile

Смежные вопросы