Группировать по условию, возможно ли? - MySQL
Формулировка задачи:
Возможно ли группировать записи, если к примеру поле `type` > 0, а если `type` = 0 - То не группировать
К примеру такая таблица:
Как на выходе получить ?
0 - Запись 1
1 - Запись 2
2 - Запись 4
0 - Запись 6
0 - Запись 7
Запрос вида:
Возвращает:
1 - Запись 2
2 - Запись 4
Возвращает:
0 - Запись 1
1 - Запись 2
2 - Запись 4
CREATE TABLE `test` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`type` INT(11) NOT NULL DEFAULT '0',
`name` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
INSERT INTO `test` (`type`,`name`) VALUES
('0','Запись 1'),
('1','Запись 2'),
('1','Запись 3'),
('2','Запись 4'),
('2','Запись 5'),
('0','Запись 6'),
('0','Запись 7');SELECT * FROM `test` GROUP BY `type` HAVING `type` > 0;
Без HAVING соответственно будет 3 записи:
SELECT * FROM `test` GROUP BY `type`;
Похоже что вот этот запрос то что мне нужно:
SELECT * FROM `test` GROUP BY CASE WHEN `type` > '0' THEN `type` ELSE `type` + `id` END;
Решение задачи: «Группировать по условию, возможно ли?»
textual
Листинг программы
mysql> SELECT * FROM `test` WHERE `type` !=0 GROUP BY TYPE -> UNION ALL -> SELECT * FROM `test` WHERE `type` =0 ORDER BY name; +----+------+----------------+ | id | TYPE | name | +----+------+----------------+ | 14 | 0 | Запись 1 | | 1 | 0 | Запись 1 | | 2 | 1 | Запись 2 | | 8 | 0 | Запись 4 | | 4 | 2 | Запись 4 | | 11 | 4 | Запись 4 | | 13 | 0 | Запись 5 | | 12 | 3 | Запись 5 | | 6 | 0 | Запись 6 | | 7 | 0 | Запись 7 | +----+------+----------------+ 10 ROWS IN SET (0.01 sec)
Объяснение кода листинга программы
- Сначала мы выбираем все строки из таблицы
test, гдеtypeне равно 0 и группируем их по значениюTYPE. - Затем мы выбираем все строки из таблицы
test, гдеtypeравно 0 и сортируем их по значениюname. - Результаты обоих запросов объединяются в один набор результатов.
- В результате мы получаем таблицу с тремя столбцами:
id,TYPEиname. В столбцеidотображаются уникальные идентификаторы записей, в столбцеTYPEотображается значение, по которому были сгруппированы строки в первом запросе, а в столбцеnameотображаются значения из второго запроса.