12
SELECT customer, SUM(price)
FROM tab GROUP BY customer 
HAVING SUM(price) IN (SELECT max(sm) FROM ( SELECT sum(price) AS sm FROM tab GROUP by customer ) AS t);

Почему такой запрос возвращает все записи, но если использовать = вместо IN, то все работает корректно?

Так же, если отдельыно выполнить SELECT max(sm) FROM ( SELECT sum(price) AS sm FROM tab GROUP by customer ) AS t и вставить результат в первоначальный запрос, то все будет корректно.

Kromster
  • 13,809
jisecayeyo
  • 1,265
  • Хм. с виду такого быть не должно. не могли бы вы привести тестовую таблицу с данными на каком нибудь sqlfiddle.com – Mike Dec 11 '16 at 11:12
  • проверил на похожей таблице у себя = и IN возвращают одинаковый результат – Mike Dec 11 '16 at 11:15
  • @Mike, http://sqlfiddle.com/#!9/b682bd/2/0 – jisecayeyo Dec 11 '16 at 11:18
  • Мистика ... Если в запрос в IN добавить union all select 0 то все становится нормально ... – Mike Dec 11 '16 at 11:29
  • @Mike, еще заметил, что на sqlfiddle.com, если выбрать версию 5.5, то все нормально, начиная с версии 5.6 - странное поведение – jisecayeyo Dec 11 '16 at 11:29
  • @Jean-Claude Да, там на выходе одно значение, но запрос реально возвращает строки со всеми значениями, а не только с тем, что дает IN ... – Mike Dec 11 '16 at 11:29
  • 1
    HAVING sum(price)+0 IN... так же дает верный результат ... и select price, sum(price) as ss .... having ss IN... то же верный – Mike Dec 11 '16 at 11:37
  • 3
    Похожая проблема на багтрекере MySQL https://bugs.mysql.com/bug.php?id=34874 в качестве решения проблемы рекомендуют использовать = :) – Mike Dec 11 '16 at 11:55

1 Answers1

1

Ответ основан на комментарии пользователя @Mike.

Судя по багтрекеру MySQL: https://bugs.mysql.com/bug.php?id=34874 – это баг, обнаруженный в 2008 году. Он до сих пор не исправлен. Проблемные версии MySQL: 5.0+

В качестве решения предлагается использовать оператор = вместо IN.

rugabarbo
  • 1,317
  • 6
  • 22