[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Создание запроса при помощи count+having
masterlelik
Создаю расширенный поиск с группами параметров:
Например:
1) Вид работ (поле cat_id)
1, пение (поле value)
2, рисование (поле value)
3, чтение (поле value)
2) Возраст детей (поле cat_id)
4, 5 лет (поле value)
5, 10 лет (поле value)
6, 12 лет (поле value)

есть таблица хранящая для каждой набор параметров
user_id | mediumint(8)
cat_id | mediumint(8)
value | mediumint(8)

Задача создать запрос для поиска, который в ХТМЛе состоит из чекбоксов.
Когда поиск состоял из одного блока, то находил всех детей, которые умели петь и рисовать запросом
select user_id, count(user_id) as cnt from t_child where value in (1, 2) group by user_id having cnt>1

А вот когда добавился второй блок, то не получается создать запрос. Как можно сделать одним запросом?

_____________
masterlelik
Решил вопрос.

Сначала не работающий запрос у меня выглядел:
select distinct `user_id`, count(`cat_id`) as cnt from `t_child` where (((`cat_id`='2' and `value`='1') or (`cat_id`='2' and `value`='2')) or ((`cat_id`='1' and `value`='4')) ) group by `t1`.`id` having cnt > 1

Но, если мне надо было найти детей 5 лет, которые умеют и петь, и рисовать.
То он также находил и 10летних детей, потому что было два true в видах работ

И понял, что не хватает distinct в count-е и поставив count(distinct `cat_id`) стало нормально и очень шустро находить.

P.S. если кто-то предложит более красивое решение, буду рад обсудить.

_____________
Игорь_Vasinsky
SELECT DISTINCT `user_id`, COUNT(`cat_id`) cnt 
FROM `t_child`
WHERE (`cat_id`=2 and `value` IN(1,2))
OR (`cat_id`= 1 AND `value`= 4)
GROUP BY `t1`.`id`
HAVING cnt > 1


Вроде так

Вы не из битрикса? оч много скобок :D

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
masterlelik
Цитата (Игорь_Vasinsky @ 26.04.2013 - 10:14)
SELECT DISTINCT `user_id`, COUNT(`cat_id`) cnt 
FROM `t_child`
WHERE (`cat_id`=2 and `value` IN(1,2))
OR (`cat_id`= 1 AND `value`= 4)
GROUP BY `t1`.`id`
HAVING cnt > 1


Вроде так

Вы не из битрикса? оч много скобок :D

Да, так более просто.
Спасибо!

Терпеть не могу битрикс по идеологическим взглядам)))

_____________
masterlelik
И все-таки вариант с хэвинг оказывается лучше.
При количестве записей 30000 этот запрос выполняется 2 секунды (да, не очень здорово)
А вот более простой вариант
SELECT DISTINCT `user_id`, COUNT(*) cnt FROM `t_child` WHERE (`cat_id`='2' AND `value` IN ('1','2')) OR (`cat_id`='1' AND `value`='4') GROUP BY user_id

Запрос подвешивается и в пхпмайдмине оно думает и думает. Минут 5 думало, устал ждать, закрыл. Проверил несколько раз - тупо виснет и все.

_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.