У меня есть мой запрос здесь
SELECT o.id, SUM(t.num) AS num
FROM table_1 o
LEFT JOIN table_2 t ON t.id = o.id
WHERE num >= 2
GROUP BY o.id
ORDER BY num DESC
Я должен использовать SELECT и o.id только там, где SUM(t.num) >= 2, но результаты в SQLFiddle совершенно неверны: http://sqlfiddle.com/#!9/754e15/2/0
Все, что я хочу сделать, это выбрать записи WHERE num >= 2 и ORDER BY num desc, мне даже не нужно выбирать SUM(t.num), поэтому я попытался удалить его и заменить каждый num на SUM(t.num), но получил Invalid use of group function,
Я стремлюсь использовать WHERE вместо HAVING. Раньше он работал с HAVING, но я хочу использовать WHERE, потому что он быстрее.
WHERE обрабатывается агрегацией перед, HAVINGпосле, поэтому разная скорость не имеет значения, потому что результат тоже другой :-)
@dnoeth Вне всякого сомнения, результат JOIN происходит после или до агрегации? Поэтому я могу использовать только HAVING?
«Раньше он работал с HAVING, но я хочу использовать WHERE, потому что он быстрее». WHERE быстрее, потому что он должен делать меньше работы, но вы получаете неверные результаты. Если вы хотите получить правильные результаты, вернитесь к HAVING.
Запрос обрабатывается в следующем логическом порядке: FROM / JOIN-> WHERE-> GROUP BY-> HAVING-> SELECT-> ORDER BY.
@dnoeth О, совсем не знал, так что, если бы я использовал подзапрос вместо соединения, он был бы хуже, чем having по скорости, потому что select возникает после having?
"Я стремлюсь использовать WHERE вместо HAVING. Раньше он работал с HAVING, но я хочу использовать WHERE, потому что он быстрее." Это утверждение - чушь полная и полная!. Два пункта служат разным целям, поэтому их относительная производительность не имеет значения. Вы могли бы сказать, что хотите использовать чайник, потому что он быстрее, чем холодильник. Вы доводите корень зла до абсурдной крайности. Я предлагаю вам лучше сосредоточиться на понимании кода первый, прежде чем сосредоточиться на производительности. Производительность уже достаточно сложна; невозможно, когда вы даже не понимаете код.






Вы можете использовать такой подзапрос:
SELECT * FROM
(SELECT o.id, SUM(t.num) num FROM table_1 o
LEFT JOIN table_2 t
ON t.id = o.id
GROUP BY o.id) T
WHERE num >= 2
Использование предложения WHERE вне подзапроса
Намек:
HAVING.