wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.

Как исправить странное поведение group by?

Здравствуйте.

Имеются две таблицы - свойства, и их значения.
Структура соответственно следующая:

products_options
bf86025dfb3b45bcaa09a9d18a7c8100.pngproduct_option_values
bca3cba5239a41b5acc6230b02777513.png

Суть проблемы такова - при выборке свойств по подходящим товарам группировка происходит неверно. Часть значений попросту исчезает.

Пример запроса:
select * from `product_options`
inner join `product_option_values` on `product_options`.`id` = `product_option_values`.`option_id`
where `product_option_values`.`product_id` in (1,2,3)
group by `product_option_values`.`value`


Как мы видим - в ответ выдаются значения, value которых не более 150.
381c78379e1a438aa70d77f068ac0ab5.png

Но если мы уберем group by...
70dd9d74000c4b94823ec8f674e470ac.png

То увидим значения с value и 200, и даже 300.
Как поступить? Я уже был на тостере с этим вопросом, но увы, мне не смогли помочь. Я уже устал вручную пересобирать таблицу (копируя данные во временную, пересоздавая, и возвращая данные обратно).

Тип таблиц - InnoDB
  • Вопрос задан
  • 294 просмотра
Решения вопроса 2
@vayho
Удалил ответ, думая что product_id все же уникален но нет.
У вас на скриншоте в IN запросе product_id 161 и 159, у них одинаковые value = 80, в такой ситуации MySQL выдает неопределенную выборку. Вот дополнительная информация:
stackoverflow.com/questions/1591909/group-by-behav...

Не используйте * в выборке, определяйте явно поля которые хотите видеть. Используйте агрегацию в GROUP BY либо делайте GROUP BY по уникальному полю если хотите видеть DISTINCT.
Ответ написан
Adamos
@Adamos
select * from `product_options`
inner join `product_option_values` on `product_options`.`id` = `product_option_values`.`option_id` AND `product_option_values`.`product_id` in (1,2,3)
group by `product_option_values`.`value`
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы