Выберите значение, где СУММ ()

У меня есть мой запрос здесь

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, потому что он быстрее.

Намек: HAVING.

Gordon Linoff 11.03.2018 23:41
WHERE обрабатывается агрегацией перед, HAVINGпосле, поэтому разная скорость не имеет значения, потому что результат тоже другой :-)
dnoeth 11.03.2018 23:43

@dnoeth Вне всякого сомнения, результат JOIN происходит после или до агрегации? Поэтому я могу использовать только HAVING?

Toleo 11.03.2018 23:46

«Раньше он работал с HAVING, но я хочу использовать WHERE, потому что он быстрее». WHERE быстрее, потому что он должен делать меньше работы, но вы получаете неверные результаты. Если вы хотите получить правильные результаты, вернитесь к HAVING.

Sergey Kalinichenko 11.03.2018 23:46

Запрос обрабатывается в следующем логическом порядке: FROM / JOIN-> WHERE-> GROUP BY-> HAVING-> SELECT-> ORDER BY.

dnoeth 11.03.2018 23:48

@dnoeth О, совсем не знал, так что, если бы я использовал подзапрос вместо соединения, он был бы хуже, чем having по скорости, потому что select возникает после having?

Toleo 11.03.2018 23:51

"Я стремлюсь использовать WHERE вместо HAVING. Раньше он работал с HAVING, но я хочу использовать WHERE, потому что он быстрее." Это утверждение - чушь полная и полная!. Два пункта служат разным целям, поэтому их относительная производительность не имеет значения. Вы могли бы сказать, что хотите использовать чайник, потому что он быстрее, чем холодильник. Вы доводите корень зла до абсурдной крайности. Я предлагаю вам лучше сосредоточиться на понимании кода первый, прежде чем сосредоточиться на производительности. Производительность уже достаточно сложна; невозможно, когда вы даже не понимаете код.

Disillusioned 12.03.2018 00:52
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
7
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать такой подзапрос:

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 вне подзапроса

Другие вопросы по теме