2015-10-12 3 views
1

У меня есть таблица "объекты":MySQL группа по с нулевым

id (int) 
name (varchar) 
group_id (varchar) default null 

я сделать некоторые вставки:

insert into objects values(null, 'Cat', null); 
insert into objects values(null, 'Dog', null); 
insert into objects values(null, 'Mouse', 'AAA'); 
insert into objects values(null, 'Eagle', 'BBB'); 
insert into objects values(null, 'Elephant', null); 
insert into objects values(null, ' Bull', 'AAA'); 

Тогда я избранная, как это:

select * from objects 

Появляются все строки, которые я вставил. Однако для тех записей, где поле «group_id» не равно null, я просто хочу, чтобы он был выбран. Если я запускаю этот запрос:

select * from objects group by group_id 

тогда только одна запись с определенным group_id будет отображаться. Проблема в том, что те записи, которые имеют group_id, установленный в NULL, будут отображаться только один раз. Я хочу, чтобы все записи отображались отдельно от тех, у которых group_id установлен на что-то. В этом случае должен появиться только на почте.

Я пробовал разные вещи, например, используя DISTINCT. Отдельно работает, если вы выбираете только указанное поле. В противном случае он извлекает дубликаты. Я также попытался сгруппировать таким образом:

group by id desc, group_id desc 

В этом случае дублирует все еще показывают вверх.

ответ

2

Один концептуально простой способ справиться с этим состоит в UNION вместе исходный запрос (слегка измененный) с запросом, чтобы получить все записи, в которых group_id равна нулю:

SELECT * FROM objects WHERE group_id IS NOT NULL GROUP BY group_id 
UNION 
SELECT * FROM objects WHERE group_id IS NULL 

SQLFiddle

Кстати , Я считаю это плохой практикой для столбцов SELECT в запросе GROUP BY, которые не являются ни агрегатами, ни столбцом, в котором происходит группировка. Поэтому рекомендуется избегать делать SELECT * с GROUP BY, и этот запрос стиля может не работать в других типах РСУБД.

Update:

Если вы не можете использовать приведенный выше запрос, то вы можете попробовать это:

SELECT * 
FROM objects 
GROUP BY COALESECE(group_id, name) 

Это будет использовать name поле на всех null групп. Конечно, это рискует тем, что null групп с то же имя по-прежнему будет агрегировано.

+0

Чем вы. Я боюсь, что я не могу использовать союз, так как приложение довольно сложно, и для объединения потребуется много изменений. Интересно, есть ли другой способ сделать это, не используя союз. – user3726562

+0

Действительно ли это так сложно? На каком языке вы используете? –

+0

Я использую PHP. Приложение ОГРОМНОЕ. – user3726562

Смежные вопросы