Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: MySQL - Создание запроса при помощи count+having
Покинул форум
Сообщений всего: 57
Дата рег-ции: Март 2012
Помог: 0 раз(а)
Создаю расширенный поиск с группами параметров:
Например:
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
А вот когда добавился второй блок, то не получается создать запрос. Как можно сделать одним запросом?
nerv
Отправлено: 26 Апреля, 2013 - 00:33:21
Посетитель
Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013 Откуда: Россия
Нет, не опечатка "Вид работ" и "Возраст детей" это значения в другой таблице:
insert into t_types (cat_id, category) values (1, 'Вид работ'), (2, 'Возраст детей'),
(Добавление)
В общем я правильно двигался и решил вопрос.
Сначала не работающий запрос у меня выглядел:
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. если кто-то предложит более красивое решение, буду рад обсудить.
блок where заключен в квадратные скобки, т.к. он может отсутствовать по условию задачи (не выбрано не одного чекбокса). Также может отсутствовать любой из операндов and. Разумеется, в этом случае and не нужен.
----- Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
LIME
Отправлено: 26 Апреля, 2013 - 15:50:48
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
выбрат кат=1 вал=2
и кат=2 вал=4
у тебя когото выберет
а не должен
каты со своими валуями
с чужими нини
и дистинкт тут всеже нужен
nerv
Отправлено: 26 Апреля, 2013 - 16:56:28
Посетитель
Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013 Откуда: Россия
Помог: 9 раз(а)
удалено
можно пример? у меня есть
1 | a
2 | b
3 | c
4 | d
5 | e
6 | f
----- Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
masterlelik
Отправлено: 26 Апреля, 2013 - 17:14:12
Новичок
Покинул форум
Сообщений всего: 57
Дата рег-ции: Март 2012
Помог: 0 раз(а)
[quote=LIME][/quote]
Проверил, все работает правильно (проверил разные вариации), если есть совпадение по подкатегориям, то находит, если хотя бы один параметр из условия отсутствует, то не находит)
Допустим мне надо выбрать 5 лет и умеющего петь, рисовать и читать.
И если не будет выбран нужный возраст, то ничего не найдет.
(Добавление)
2LIME:
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
Да, это более простое решение, как-то странно, что я уперся в этот хэвинг
Спасибо.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.