Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсчёт записей SET
 
 автор: Эй   (02.07.2008 в 01:48)   письмо автору
 
 

Дамп:

--
-- Структура таблицы `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... очень сильно.

   
 
 автор: exp   (02.07.2008 в 03:33)   письмо автору
 
   для: Эй   (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

   
 
 автор: Эй   (02.07.2008 в 12:06)   письмо автору
 
   для: exp   (02.07.2008 в 03:33)
 

>COUNT( IF(FIND_IN_SET('t1', myset), 0, NULL))

Если честно, условие IF не понял. Считать или 0 или NULL? смысл? Наверно не 0, а 1.

В любом случае придётся прописывать все 60 вариантов, этого и хотелось бы избежать, уж очень громоздко выглядит.

   
 
 автор: Trianon   (02.07.2008 в 13:30)   письмо автору
 
   для: Эй   (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`

   
 
 автор: Эй   (02.07.2008 в 14:36)   письмо автору
 
   для: Trianon   (02.07.2008 в 13:30)
 

2exp, теперь понял, я когда в первый раз смотрел, почему то COUNT с SUM перепутал ))

exp, Trianon спасибо :)

   
 
 автор: Эй   (02.07.2008 в 17:44)   письмо автору
 
   для: Эй   (02.07.2008 в 14:36)
 

-deleted-

   
 
 автор: Эй   (02.07.2008 в 17:49)   письмо автору
 
   для: Эй   (02.07.2008 в 14:36)
 

Всё таки забыл сказать зачем я через UNION это дело оформлял, мне нужно отсортировать эти записи по количеству, но в UNION получается много отдельных запросов, каждый из которых будет просматривать всю таблицу. А если они возвращаются в 1 ряд, то придётся делать сортировку средствами PHP...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования