|
|
|
| Дамп:
--
-- Структура таблицы `testset`
--
CREATE TABLE IF NOT EXISTS `testset` (
`myset` set('t1','t2','t3','t4','t5') NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Дамп данных таблицы `testset`
--
INSERT INTO `testset` (`myset`) VALUES
('t1,t3,t4'),
('t1,t5'),
('t1,t2,t3'),
('t2,t4,t5'),
('t2,t3'),
('t5'),
('t1,t3,t4,t5'),
('t2,t4'),
('t1,t2,t4'),
('t2,t3'),
('t2,t5'),
('t3,t4'),
('t1,t2,t3,t4'),
('t2,t3,t4');
|
Задача: получить количество записей для каждого из возможных значений поля `myset` (t1,t2,t3,t4 и t5), в которых оно (значение) установлено. Т.е. `t1` установлено в N1 записях, `t2` установлено в N2 записях и т.д. Как сделать это пятью запросами я догадываюсь. Хотелось бы увидеть решение в 1 запрос (без всяких UNION :) ), хотя сдаётся мне, что такого решения не существует (меня пока не осенило).
Пока на очереди вот это:
SELECT 't1' AS `fld` , COUNT( * ) AS `c`
FROM `testset`
WHERE FIND_IN_SET( 't1', `myset` )
UNION SELECT 't2' AS `fld` , COUNT( * ) AS `c`
FROM `testset`
WHERE FIND_IN_SET( 't2', `myset` )
UNION SELECT 't3' AS `fld` , COUNT( * ) AS `c`
FROM `testset`
WHERE FIND_IN_SET( 't3', `myset` )
UNION SELECT 't4' AS `fld` , COUNT( * ) AS `c`
FROM `testset`
WHERE FIND_IN_SET( 't4', `myset` )
UNION SELECT 't5' AS `fld` , COUNT( * ) AS `c`
FROM `testset`
WHERE FIND_IN_SET( 't5', `myset` )
ORDER BY `c` DESC
|
И запрос разрастётся при 60 вариантах SET... очень сильно. | |
|
|
|
|
|
|
|
для: Эй
(02.07.2008 в 01:48)
| |
SELECT COUNT( IF(FIND_IN_SET('t1', myset), 0, NULL)),
COUNT( IF(FIND_IN_SET('t2', myset), 0, NULL)),
COUNT( IF(FIND_IN_SET('t3', myset), 0, NULL)),
COUNT(IF( FIND_IN_SET('t4', myset), 0, NULL)),
COUNT(IF( FIND_IN_SET('t5', myset), 0, NULL))
FROM testset
|
| |
|
|
|
|
|
|
|
для: exp
(02.07.2008 в 03:33)
| | >COUNT( IF(FIND_IN_SET('t1', myset), 0, NULL))
Если честно, условие IF не понял. Считать или 0 или NULL? смысл? Наверно не 0, а 1.
В любом случае придётся прописывать все 60 вариантов, этого и хотелось бы избежать, уж очень громоздко выглядит. | |
|
|
|
|
|
|
|
для: Эй
(02.07.2008 в 12:06)
| | COUNT с считает строки с присутствующими полями. Точнее - их и только их.
Проще написать
SELECT
SUM(FIND_IN_SET('t1', myset) > 0) AS cnt1,
SUM(FIND_IN_SET('t2', myset) > 0) AS cnt2,
SUM(FIND_IN_SET('t3', myset) > 0) AS cnt3,
SUM(FIND_IN_SET('t4', myset) > 0) AS cnt4,
SUM(FIND_IN_SET('t5', myset) > 0) AS cnt5
FROM `testset`
|
| |
|
|
|
|
|
|
|
для: Trianon
(02.07.2008 в 13:30)
| | 2exp, теперь понял, я когда в первый раз смотрел, почему то COUNT с SUM перепутал ))
exp, Trianon спасибо :) | |
|
|
|
|
|
|
|
для: Эй
(02.07.2008 в 14:36)
| | -deleted- | |
|
|
|
|
|
|
|
для: Эй
(02.07.2008 в 14:36)
| | Всё таки забыл сказать зачем я через UNION это дело оформлял, мне нужно отсортировать эти записи по количеству, но в UNION получается много отдельных запросов, каждый из которых будет просматривать всю таблицу. А если они возвращаются в 1 ряд, то придётся делать сортировку средствами PHP... | |
|
|
|
|