MySQL группирует и пропускает группировку по нулевым значениям

select * from dc_deal group by collection_id

В столбце collection_id у меня есть значения (1,3,3,4,4,5,NULL,NULL). Приведенный выше запрос вернет строки с (1,2,3,4,NULL), но я хочу пропустить группировку по значению NULL и мне нужен результат, например (1,2,3,4,NULL ,НОЛЬ)


person Wasim A.    schedule 13.03.2014    source источник
comment
Вы можете использовать объединение с первым сгруппированным выбором, ограниченным where collection_id is not null, а вторым, разгруппированным, ограниченным where collection_id is null   -  person barry-johnson    schedule 13.03.2014
comment
хороший вариант, но нужен еще более эффективный запрос, мне нужно еще больше расширить фильтр по запросу, поэтому объединение сделает его медленнее   -  person Wasim A.    schedule 13.03.2014
comment
используя союз, я даже не могу заказать по start_date и т. д.   -  person Wasim A.    schedule 13.03.2014
comment
Не могли бы вы показать структуру таблицы?   -  person Raging Bull    schedule 13.03.2014
comment
re: «используя союз, я не могу даже упорядочить по start_date и т. д.» - я не видел started_date в вашем запросе выше. Я понимаю, что не хочу публиковать весь ваш запрос, но, по крайней мере, что-то, что на самом деле передает то, что вы хотите сделать, экономит всем время.   -  person barry-johnson    schedule 13.03.2014
comment
Нет необходимости использовать UNION или UNION ALL. Вы можете добавить другое выражение в предложение GROUP BY. (Обратите внимание, что операция UNION удаляет повторяющиеся строки; если вам это не нужно, то для повышения производительности используйте вместо этого оператор UNION ALL, чтобы избежать накладных расходов, связанных с сортировкой, необходимой для удаления дубликатов. Обратите внимание, что можно использовать ORDER BY с запросом UNION или UNION ALL, но он может ссылаться только на столбцы/выражения в списке SELECT запроса, и эти ссылки должны быть по имени столбца или по порядковому номеру в результирующем наборе.   -  person spencer7593    schedule 13.03.2014


Ответы (3)


Если у нас есть уникальный столбец (или набор столбцов) в таблице, мы можем добавить еще одно выражение в GROUP BY.

Выражение должно возвращать уникальное значение для каждой строки, когда collection_id равно нулю. В противном случае возвращается константа.

Предполагая, что у нас есть уникальный столбец id в таблице, мы можем сделать что-то вроде этого:

... GROUP BY collection_id, IF(collection_id IS NULL, id, 0)

Это второе выражение в GROUP BY возвращает постоянное значение 0, когда collection_id не равно нулю. Но он возвращает уникальное значение для каждой строки, когда collection_id имеет значение null.

Обратите внимание, что id здесь — это просто ссылка на столбец, который определен как уникальный в пределах таблицы. ПЕРВИЧНЫЙ КЛЮЧ — хороший кандидат. Если у нас нет уникального индекса для одного столбца, мы можем повторить тот же тип выражения для каждого столбца в нашем уникальном ограничении или для любого набора выражений, который гарантированно будет уникальным в каждой строке.

... GROUP BY collection_id
           , IF(collection_id IS NULL, col1, '')
           , IF(collection_id IS NULL, col2, NULL)
           , IF(collection_id IS NULL, col3, collection_id)

В качестве альтернативы мы можем использовать выражение, генерирующее уникальное значение:

... GROUP BY IFNULL(collection_id,UUID())
person spencer7593    schedule 13.03.2014
comment
я не понимаю, ЕСЛИ (коллекция_id IS NULL, id, 0) после группы по, какова ее связь и т. д. с группой по - person Wasim A.; 13.03.2014
comment
@Wasim: предложение GROUP BY включает список выражений, разделенных запятыми. Вы можете GROUP BY более одного столбца. Например, вы можете GROUP BY collection_id, purchase_year получить строки с одинаковым идентификатором collection_id в нескольких строках, но для каждого значения collection_id значения Purchase_year будут разными. Хитрость для получения желаемого результата заключается в использовании выражения, которое возвращает либо уникальное, либо постоянное значение в зависимости от условия. - person spencer7593; 13.03.2014
comment
IFNULL(collection_id, 0) можно короче :) - person Timo Huovinen; 18.07.2014
comment
@TimoHuovinen: Да, это правда, что IFNULL(collection_id,0) — это более короткое выражение. Но, к сожалению, это более короткое выражение не помогает вернуть указанный набор результатов. Чтобы вернуть запрошенный результат OP, нам нужно вернуть УНИКАЛЬНОЕ значение для каждой строки, где collection_id равно NULL. Таким образом, возврат постоянного нуля вместо постоянного NULL не помогает. - person spencer7593; 26.06.2015
comment
СГРУППИРОВАТЬ ПО IFNULL (идентификатор_коллекции, UUID()) - person EthraZa; 13.09.2016

Попробуй это:

SELECT * FROM dc_deal 
GROUP BY collection_id, 
case WHEN collection_id IS NULL THEN ID ELSE 0 END

Замените ID другим столбцом в таблице для группировки.

См. пример в SQL Fiddle.

person Raging Bull    schedule 13.03.2014

Попробуйте следующее :
выберите * из dc_deal, где collection_id НЕ NUll сгруппируйте по collection_id

MySQL SELECT только не нулевые значения

person Sagar    schedule 23.07.2018