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
Форумы портала PHP.SU :: Версия для печати :: MySQL - Создание запроса при помощи count+having
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » MySQL - Создание запроса при помощи count+having

Страниц (2): [1] 2 »
 

1. masterlelik - 25 Апреля, 2013 - 23:12:34 - перейти к сообщению
Создаю расширенный поиск с группами параметров:
Например:
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

А вот когда добавился второй блок, то не получается создать запрос. Как можно сделать одним запросом?
2. nerv - 26 Апреля, 2013 - 00:33:21 - перейти к сообщению
ща я тебе насоветую Радость

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM your_table AS t WHERE (дальше магия)
  2. t.FIELD = значение_выбранное_в_чекбоксе AND
  3. t.FIELD = значение_выбранное_в_чекбоксе
  4. etc.
3. LIME - 26 Апреля, 2013 - 00:38:35 - перейти к сообщению
оба запроса гениальны
2ой так совсем))
я как-то не понимаю что надо
4. masterlelik - 26 Апреля, 2013 - 07:56:27 - перейти к сообщению
LIME пишет:
оба запроса гениальны
2ой так совсем))
я как-то не понимаю что надо

Надо чтоб были найдены все дети, которым 5 лет или 10 лет, и которые умеют и петь, и рисовать.
5. nerv - 26 Апреля, 2013 - 10:19:17 - перейти к сообщению
masterlelik пишет:
Надо чтоб были найдены все дети, которым 5 лет или 10 лет, и которые умеют и петь, и рисовать.

уверен, что при такой структуре таблиц

сможешь это сделать?
6. LIME - 26 Апреля, 2013 - 10:23:40 - перейти к сообщению
masterlelik я структуру таблиц не понял
7. masterlelik - 26 Апреля, 2013 - 12:05:04 - перейти к сообщению
LIME пишет:
masterlelik я структуру таблиц не понял

user_id - id ребенка
cat_id - id категории
value - числовое значение умения ребенка
8. nerv - 26 Апреля, 2013 - 12:19:44 - перейти к сообщению
masterlelik пишет:
1) Вид работ (поле cat_id)

masterlelik пишет:
2) Возраст детей (поле cat_id)

опечатка?

псевдокод
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT user_id
  2. FROM t_child
  3. [ WHERE  (cat_id = selected_category [ AND ... ])
  4. AND ( value = selected_value [ AND ...]) ]


или

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT user_id
  2. FROM t_child
  3. [ WHERE cat_id IN (selected_categories)
  4. AND value IN (selected_values) ]
9. masterlelik - 26 Апреля, 2013 - 12:23:32 - перейти к сообщению
nerv пишет:
masterlelik пишет:
1) Вид работ (поле cat_id)

masterlelik пишет:
2) Возраст детей (поле cat_id)

опечатка?

псевдокод
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT user_id
  2. FROM t_child
  3. [ WHERE  (cat_id = selected_category [ AND ... ])
  4. AND ( value = selected_value [ AND ...]) ]


Нет, не опечатка "Вид работ" и "Возраст детей" это значения в другой таблице:
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. если кто-то предложит более красивое решение, буду рад обсудить.
10. nerv - 26 Апреля, 2013 - 13:02:49 - перейти к сообщению
masterlelik пишет:
если кто-то предложит более красивое решение, буду рад обсудить.
nerv пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT user_id
  2. FROM t_child
  3. [ WHERE cat_id IN (selected_categories)
  4. AND value IN (selected_values) ]
11. LIME - 26 Апреля, 2013 - 13:06:29 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT `user_id`
  2. FROM `t_child` WHERE
  3. (`cat_id`='2' AND `value` IN ('1','2')) OR (`cat_id`='1' AND `value`='4')
?
(Добавление)
если всеже нужно их колво
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT `user_id`, COUNT(*) cnt
  2. FROM `t_child` WHERE
  3. (`cat_id`='2' AND `value` IN ('1','2')) OR (`cat_id`='1' AND `value`='4')
  4. GROUP BY user_id
но хэвинг тут не надо
(Добавление)
nerv http://www[dot]sql-ex[dot]ru/index.php
12. nerv - 26 Апреля, 2013 - 15:23:19 - перейти к сообщению
LIME, спасибо, конечно, но я не совсем понял, чем обязан? Закатив глазки

nerv пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT user_id
  2. FROM t_child
  3. [ WHERE cat_id IN (selected_categories)
  4. AND value IN (selected_values) ]

блок where заключен в квадратные скобки, т.к. он может отсутствовать по условию задачи (не выбрано не одного чекбокса). Также может отсутствовать любой из операндов and. Разумеется, в этом случае and не нужен.
13. LIME - 26 Апреля, 2013 - 15:50:48 - перейти к сообщению
выбрат кат=1 вал=2
и кат=2 вал=4
у тебя когото выберет
а не должен
каты со своими валуями
с чужими нини
и дистинкт тут всеже нужен
14. nerv - 26 Апреля, 2013 - 16:56:28 - перейти к сообщению
удалено

можно пример? у меня есть
1 | a
2 | b
3 | c
4 | d
5 | e
6 | f

пишу
CODE (SQL):
скопировать код в буфер обмена
  1. "SELECT F1, F2 FROM table WHERE F1 IN (5,2,1) AND F2 IN ('b','c');"

результат
2 | b

Что не так?
15. masterlelik - 26 Апреля, 2013 - 17:14:12 - перейти к сообщению
[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

Да, это более простое решение, как-то странно, что я уперся в этот хэвингУлыбка
Спасибо.

 

Powered by ExBB FM 1.0 RC1