LINUX.ORG.RU

Почему такое поведение Group by в MySQL?

 


0

2

Таблицы https://wampi.ru/image/Rwq0hUw

У каждого товара 3 характеристики (цвет,размер,материал).

Нужно найти все товары с данными характеристиками: зеленый цвет, размер 10, материал шелк.

Написал такой запрос:

SELECT name,
       product_id
FROM product_properties pp
JOIN products p ON pp.product_id = p.id
WHERE (TYPE = 'color'
       AND value='Зеленый')
  OR (TYPE = 'size'
      AND value='10')
  OR (TYPE = 'material'
      AND value='Шелк')
GROUP BY product_id
HAVING COUNT(*) = 3

Запрос работает, результат меня устраивает.

Вопрос: почему запрос отрабатывает, а не вываливается в ошибку? В секции SELECT не может же быть тех полей, которых нет в Group By. Пытаюсь разобраться. Этот же запрос не работает в PostgreSQL, что на мой взгляд верно. Другие СУБД не тестил.


В секции SELECT не может же быть тех полей, которых нет в Group By.

наоборот

anonymous
()

Вопрос: почему запрос отрабатывает, а не вываливается в ошибку? В секции SELECT не может же быть тех полей, которых нет в Group By. Пытаюсь разобраться. Этот же запрос не работает в PostgreSQL, что на мой взгляд верно.

Твой сервер так настроен. По дефолту будет ошибка. https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

Так у меня по дефолту ONLY_FULL_GROUP_BY. Ошибка

 SELECT city, age FROM clients GROUP BY city

Это с JOIN как-то по другому работает

KRex
() автор топика
Ответ на: комментарий от no-such-file

ну дак при only_full_group_by и не может быть в select тех полей, которых нет в Group By

KRex
() автор топика

Не работает MySQL Тестировал тоьлько на постгре

Ты б определился

kardapoltsev ★★★★★
()

В секции SELECT не может же быть тех полей, которых нет в Group By

MySQL'ю на это насрать, он выдаст туда то, что попадётся. Если у тебя в таком случае домен из одного значения в рамках групировки, то считай повезло.

Этот же запрос не работает в PostgreSQL, что на мой взгляд верно.

Потому что там нормальный строгий sql, а в mysql - пхпшно-хипсторский и позволяет подобные трюки.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от KRex

Там по ссылке говорится про functionally dependent on (uniquely determined by) GROUP BY columns.

goingUp ★★★★★
()

Насколько я понимаю, мускуль при этом просто возьмёт одно из значений.

Miguel ★★★★★
()

Только с mysql 8 они включили поведение с ошибкой по-умоляанию. Раньше было, как будто ты к ааждому полю ANY приписал

alexmaru
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.