SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.01.2026 17:13:37

jenia0jenia
Участник
Зарегистрирован: 28.01.2026
Сообщений: 4

having и having max(arg)...

Друзья, объясните, пожалуйста, почему

SELECT client_name
FROM orders
JOIN clients USING(client_id)
GROUP BY client_id, client_name
HAVING COUNT(*) = 1
   AND MIN(order_date) = '2022-01-05'
   AND MAX(order_date) = '2022-01-05';


ошибк не выдаст, а


...

HAVING COUNT(*) = 1
   AND order_date = '2022-01-05';


выдаст?

Заранее спасибо за ответ

Отредактированно jenia0jenia (28.01.2026 17:14:18)

Неактивен

 

#2 28.01.2026 17:50:15

estic
Завсегдатай
Зарегистрирован: 01.10.2022
Сообщений: 30

Re: having и having max(arg)...

При группировке у вас будут группы, а не обычные записи. Не понятно, какое значение из группы брать для сравнения (у одного пользователя могут быть разные order_date). Если все равно, какое значение использовать (но тогда какой смысл сравнивать?), можно указать агрегат ANY_VALUE(). Если нужно отобрать записи по order_date, используйте условие в выражении WHERE, а не HAVING.

Неактивен

 

#3 28.01.2026 18:37:38

jenia0jenia
Участник
Зарегистрирован: 28.01.2026
Сообщений: 4

Re: having и having max(arg)...

estic написал:

При группировке у вас будут группы, а не обычные записи. Не понятно, какое значение из группы брать для сравнения (у одного пользователя могут быть разные order_date). Если все равно, какое значение использовать (но тогда какой смысл сравнивать?), можно указать агрегат ANY_VALUE(). Если нужно отобрать записи по order_date, используйте условие в выражении WHERE, а не HAVING.

ищу клинета, совершившего только один заказ и только '2022-01-05'.

SELECT client_name
FROM orders
JOIN clients USING(client_id)
WHERE order_date = '2022-01-05'
GROUP BY client_id, client_name
HAVING COUNT(*) = 1


такой вот запрос не подойдёт.

Задачка учебная

Отредактированно jenia0jenia (28.01.2026 18:40:44)

Неактивен

 

#4 28.01.2026 18:39:37

jenia0jenia
Участник
Зарегистрирован: 28.01.2026
Сообщений: 4

Re: having и having max(arg)...

estic написал:

При группировке у вас будут группы

поэтому я могу использовать order_date в функции min-max , а без них не могу?

Неактивен

 

#5 28.01.2026 20:37:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5851

Re: having и having max(arg)...

Да. В части HAVING без группирующих функций можно указывать только те поля, по которым идет группировка (у вас это  client_id, client_name)
Кстати, зачем вы делаете группировку ещё и по client_name? client_id ведь уникально.
Условие достаточно только одно: на min или max.

SELECT client_name
FROM orders
JOIN clients USING(client_id)
GROUP BY client_id
HAVING COUNT(*) = 1
   AND MIN(order_date) = '2022-01-05';

Неактивен

 

#6 30.01.2026 11:01:39

jenia0jenia
Участник
Зарегистрирован: 28.01.2026
Сообщений: 4

Re: having и having max(arg)...

vasya написал:

Да. В части HAVING без группирующих функций можно указывать только те поля, по которым идет группировка (у вас это  client_id, client_name)
Кстати, зачем вы делаете группировку ещё и по client_name? client_id ведь уникально.
Условие достаточно только одно: на min или max.

SELECT client_name
FROM orders
JOIN clients USING(client_id)
GROUP BY client_id
HAVING COUNT(*) = 1
   AND MIN(order_date) = '2022-01-05';

Спасибо, стало яснее!

Неактивен

 

#7 30.01.2026 14:58:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5851

Re: having и having max(arg)...

Кстати, упустил, вместо

SELECT client_name

нужно
SELECT ANY_VALUE(client_name)

см https://sqlinfo.ru/articles/info/18.html

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson