2015-06-26 4 views
0

Представьте таблицу с двумя столбцами (есть больше, но не имеет значения, так или иначе к этому вопросу):Проблема с HAVING в SQL запросе

`EAN` bigint(20) unsigned DEFAULT NULL, 
    `parameter_id` mediumint(8) unsigned DEFAULT NULL, 

Этот запрос не работает, и возвращает сообщение об ошибке:

SELECT EAN FROM eTovar WHERE EAN GROUP BY EAN HAVING parameter_id IS NULL 

Error in query (1054): Unknown column 'parameter_id' in 'having clause'

Но этот запрос работает:

SELECT EAN FROM eTovar WHERE EAN GROUP BY EAN HAVING MIN(parameter_id) != MAX(parameter_id) 

Я предполагаю, что по какой-то причине HAVING может достигнуть MIN (parameter_id), но не может достичь чистого параметра_ид. Почему?

У меня есть MariaDB 5.5 (должно быть таким же, как MySQL 5.5).

+0

Это может быть немного более полезным, если бы вы предоставить ваш SQL схему. (возможно, что-то подумать о будущем) –

+0

Я не думал, что это необходимо, так как это всего две колонки, но вы здесь. – Martin

ответ

2

Согласно MySQL 5.5 docs

In standard SQL, a query that includes a GROUP BY clause cannot refer to nonaggregated columns in the HAVING clause that are not named in the GROUP BY clause. A MySQL extension permits references to such columns to simplify calculations. This extension assumes that the nongrouped columns will have the same group-wise values. Otherwise, the result is indeterminate. [...]
In some cases, you can use MIN() and MAX() to obtain a specific column value even if it is not unique.

Вы пытались заменить HAVING с WHERE в первом SQL:

SELECT EAN FROM eTovar WHERE EAN AND parameter_id IS NULL GROUP BY EAN; 
+0

Я собирался предложить то же самое. Использование WHERE вместо HAVING работает для меня с аналогично построенными запросами с использованием MySQL Workbench на таблице InnoDB. –

+0

Если я поместил 'parameter_id IS NULL' в' WHERE', он будет отфильтрован в 'HAVING' – Martin

+0

. Я думаю, мне просто нужно поставить' parameter_id' при выборе столбцов, а затем удалить столбец позже ... – Martin