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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
masterlelik
Отправлено: 25 Апреля, 2013 - 23:12:34
Post Id


Новичок


Покинул форум
Сообщений всего: 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

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



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




ща я тебе насоветую Радость

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM your_table AS t WHERE (дальше магия)
  2. t.FIELD = значение_выбранное_в_чекбоксе AND
  3. t.FIELD = значение_выбранное_в_чекбоксе
  4. etc.


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
LIME
Отправлено: 26 Апреля, 2013 - 00:38:35
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




оба запроса гениальны
2ой так совсем))
я как-то не понимаю что надо
 
 Top
masterlelik
Отправлено: 26 Апреля, 2013 - 07:56:27
Post Id


Новичок


Покинул форум
Сообщений всего: 57
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




LIME пишет:
оба запроса гениальны
2ой так совсем))
я как-то не понимаю что надо

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

(Отредактировано автором: 26 Апреля, 2013 - 07:57:59)

 
 Top
nerv
Отправлено: 26 Апреля, 2013 - 10:19:17
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




masterlelik пишет:
Надо чтоб были найдены все дети, которым 5 лет или 10 лет, и которые умеют и петь, и рисовать.

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

сможешь это сделать?


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
LIME
Отправлено: 26 Апреля, 2013 - 10:23:40
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




masterlelik я структуру таблиц не понял
 
 Top
masterlelik
Отправлено: 26 Апреля, 2013 - 12:05:04
Post Id


Новичок


Покинул форум
Сообщений всего: 57
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




LIME пишет:
masterlelik я структуру таблиц не понял

user_id - id ребенка
cat_id - id категории
value - числовое значение умения ребенка
 
 Top
nerv
Отправлено: 26 Апреля, 2013 - 12:19:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




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) ]

(Отредактировано автором: 26 Апреля, 2013 - 12:25:40)



-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
masterlelik
Отправлено: 26 Апреля, 2013 - 12:23:32
Post Id


Новичок


Покинул форум
Сообщений всего: 57
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




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. если кто-то предложит более красивое решение, буду рад обсудить.

(Отредактировано автором: 26 Апреля, 2013 - 12:30:42)

 
 Top
nerv
Отправлено: 26 Апреля, 2013 - 13:02:49
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




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) ]


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
LIME
Отправлено: 26 Апреля, 2013 - 13:06:29
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




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
 
 Top
nerv
Отправлено: 26 Апреля, 2013 - 15:23:19
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




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 не нужен.


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
LIME
Отправлено: 26 Апреля, 2013 - 15:50:48
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




выбрат кат=1 вал=2
и кат=2 вал=4
у тебя когото выберет
а не должен
каты со своими валуями
с чужими нини
и дистинкт тут всеже нужен
 
 Top
nerv
Отправлено: 26 Апреля, 2013 - 16:56:28
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




удалено

можно пример? у меня есть
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

Что не так?

(Отредактировано автором: 26 Апреля, 2013 - 17:09:33)



-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
masterlelik
Отправлено: 26 Апреля, 2013 - 17:14:12
Post Id


Новичок


Покинул форум
Сообщений всего: 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

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

(Отредактировано автором: 26 Апреля, 2013 - 17:26:35)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB