SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.05.2011 17:17:34

BeHappy
Участник
Зарегистрирован: 01.05.2011
Сообщений: 5

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

Здравствуйте!
Сразу скажу, поиском пробовал пользоваться, но не смог грамотно сформулировать - что же найти.
Версия MySQL:
mysql  Ver 14.14 Distrib 5.1.41, for debian-linux-gnu (i486) using readline 6.1
Имеется три(в общем случае) таблицы:

parameter:

| id | name           |
+----+----------------+
|  1 | производитель  |
|  2 | сокет          |
|  3 | память         |
+----+----------------+

parameterlist:
+----+--------------+------------+
| id | parameter_id | value      |
+----+--------------+------------+
|  1 |            1 | Intel      |
|  2 |            1 | AMD        |
|  5 |            2 | 478        |
|  7 |            3 | 2 Gb       |
+----+--------------+------------+


modelparameter
+----------+--------------+--------------------+
| model_id | parameter_id | parameter_value_id |
+----------+--------------+--------------------+
|        1 |            1 |                  1 |
|        1 |            2 |                  5 |
|        2 |            1 |                  3 |
|        2 |            3 |                  9 |
+----------+--------------+--------------------+
 

Таблицы пообрезал, чтобы не захламлять вам тут форум smile
Необходимо построить запрос из modelparameter, который выдаст model_id по некоторым значением parameter_value_id одновременно.
Т.е. у нас есть model_id=1, которому соответствуют parameter_value_id 1 и 5 (из таблицы parameterlist это Intel и 478)
Пробуем найти этот model_id по этим критериям (parameter_value_id=1 и 5)

SELECT model_id FROM modelparameter WHERE parameter_value_id IN (1,5)

Так найдется две записи с model_id.
И если попробовать сделать неверные критерии поиска ( IN (1,3) ), то запись с model_id всё равно появится. Оно и понятно почему - эта строка попадает под критерии поиска (parameter_value_id=1)
Если вместо IN использовать parameter_value_id=1 AND parameter_value_id=5, то у нас получится пустой результат, что и логично - тут получается, что поле в одной и той же записи будет равно одновременно двум значениям.
Собственно, вопрос: как использовать сразу несколько значений parameter_value_id?

Неактивен

 

#2 01.05.2011 17:24:24

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Составление запроса на выборку по нескольким значениям одного поля

Здравствуйте.

Если я правильно понял, то приведенный запрос

SELECT model_id FROM modelparameter WHERE parameter_value_id IN (1,5);
Вас не устраивает только тем, что нужная model_id выводится 2 раза вместо одного.
Выберите без повторов, вот так:
SELECT distinct model_id FROM modelparameter WHERE parameter_value_id IN (1,5);

Или можно так еще:
SELECT model_id FROM modelparameter WHERE parameter_value_id IN (1,5) group by model_id;

Отредактированно deadka (01.05.2011 17:25:26)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 01.05.2011 18:07:59

BeHappy
Участник
Зарегистрирован: 01.05.2011
Сообщений: 5

Re: Составление запроса на выборку по нескольким значениям одного поля

Нет, не в том дело. Оно ищет model_id по 1 или 5. А мне необходимо сразу по нескольким параметрам
Т.е. если выбрать несоответсвующий действительности запрос: IN (2,5) т.е. AMD и 478, в результат все равно выведется model_id=1, хотя оно соответствует только одному критерию запроса (5)

Неактивен

 

#4 01.05.2011 18:12:21

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Составление запроса на выборку по нескольким значениям одного поля

Эхм... Посмотрите вот этот топик.

SELECT model_id, COUNT(*) AS c FROM modelparameter WHERE parameter_value_id IN (1,5) GROUP BY 1 HAVING c = 2.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 01.05.2011 18:27:38

BeHappy
Участник
Зарегистрирован: 01.05.2011
Сообщений: 5

Re: Составление запроса на выборку по нескольким значениям одного поля

Ах вон оно что... Т.е. мы вибираем только то, что имеет количество соответсвий 2
Я так понимаю, что GROUP BY 1 эквивалентно GROUP BY model_id и 1 - это порядковый номер выбираемого поля?
Получается, если параметров больше двух (допустим, у нас забиты еще и Частота процессора, техпроцесс), а выбираем только по двум, то вместо HAVING c=2 ставим HAVING c>=2. Верно?

Отредактированно BeHappy (01.05.2011 18:29:34)

Неактивен

 

#6 01.05.2011 18:31:30

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Составление запроса на выборку по нескольким значениям одного поля

BeHappy написал:

Я так понимаю, что GROUP BY 1 эквивалентно GROUP BY model_id и 1 - это порядковый номер выбираемого поля?

Да, group by 1 - это значит сгруппировать по первому полю в выборке.

BeHappy написал:

Получается, если параметров больше двух (допустим, у нас забиты еще и Частота процессора, техпроцесс), то вместо HAVING c=2 ставим HAVING c>=2. Верно?

Как бы да, только с условием IN (1,5) тоже нужно соотносить smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 01.05.2011 18:36:40

BeHappy
Участник
Зарегистрирован: 01.05.2011
Сообщений: 5

Re: Составление запроса на выборку по нескольким значениям одного поля

deadka написал:

Как бы да, только с условием IN (1,5) тоже нужно соотносить

Хм.
Т.е. в клиентской программе вводим переменную, которая держит в себе количество выбранных параметров, и в запросе будет HAVING c=переменная.
Вот такое соотношение будет верным, как мне представляется.
Большое спасибо!
Еще вопрос: а можно ли не включать COUNT(*) в результат выборки?
Т.е.

SELECT model_id FROM modelparameter WHERE parameter_value_id IN (1,5) GROUP BY 1 HAVING COUNT(*)=2;


BeHappy написал:

а выбираем только по двум, то вместо HAVING c=2 ставим HAVING c>=2. Верно?

Вот тут напутал (а еще редактированием вас запутал, похоже)
Попробовал повыполнять запросы, дошло.
Тут нужно строгое =, без >=

Отредактированно BeHappy (01.05.2011 18:46:03)

Неактивен

 

#8 01.05.2011 18:54:06

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Составление запроса на выборку по нескольким значениям одного поля

BeHappy написал:

Т.е. в клиентской программе вводим переменную, которая держит в себе количество выбранных параметров, и в запросе будет HAVING c=переменная.
Вот такое соотношение будет верным, как мне представляется.

Ну, в зависимости от бизнес-логики Вашего приложения, наверное да smile.

BeHappy написал:

Еще вопрос: а можно ли не включать COUNT(*) в результат выборки?
Т.е.

SELECT model_id FROM modelparameter WHERE parameter_value_id IN (1,5) GROUP BY 1 HAVING COUNT(*)=2;

Да, можно.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 01.05.2011 22:51:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Составление запроса на выборку по нескольким значениям одного поля

И нормализуйте, пожалуйста, последнюю табличку. Не имеет смысла
держать поле modelparameter(parameter_id), т.к. оно следует из
parameter_value_id.

Неактивен

 

#10 01.05.2011 23:16:30

BeHappy
Участник
Зарегистрирован: 01.05.2011
Сообщений: 5

Re: Составление запроса на выборку по нескольким значениям одного поля

paulus написал:

И нормализуйте, пожалуйста, последнюю табличку

Да это уже давно понял, спасибо. Эта БД вообще тестовая, я ее периодически видоизменяю, потом уже как со всем определюсь - сделаю всё как надо (ну или как смогу, но лучше, чем сейчас)

Неактивен

 

#11 26.02.2013 17:59:15

h4ssler
Участник
Зарегистрирован: 26.02.2013
Сообщений: 1

Re: Составление запроса на выборку по нескольким значениям одного поля

Здравствуйте, извините за некропост, в поиске нашел эту тему.
У меня проблема немного схожая.
Имеется две таблицы, пускай они будут называться cat_product и cat

Они имеют вид
cat_product
+----+--------------+------------+
| id | product_id    | cat_id  |
+----+--------------+------------+
|  1 |                1 | 1        |
|  2 |                1 | 17      |
|  5 |                2 | 17      |
|  7 |                2 | 1        |
+----+--------------+------------+
и
cat
| cat_id | name            |
+----+----------------+
|  1       | Лыжи           |
|  17       | Fisher         |
|  19       | Лыжник         |
+----+----------------+
Мне нужно селектом вытащить product id, cat_id, которых соответствует строго значениям 'Лыжи' и 'Fischer' (эти значения находятся в переменных).

Для примера, если одна переменная содержит "Лыжи", а другая "Fisher" то выбираются значения product_id 1 и 2, а если вторая переменная содержит значение "Лыжник", то не выбирается ничего.

Добился я пока того, что происходит вывод product_id по 2 раза, с разными значениями cat_id (его я вывожу дабы понять, нашел он 2 одинаковых значения или нет)
Вопрос такой - как реализовать сравнение и выборку  product_id по двум значениям name.

Надеюсь, все смог понять объяснитьsmile Заранее спасибо за любую помощь.

Неактивен

 

#12 26.02.2013 22:24:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Составление запроса на выборку по нескольким значениям одного поля

select product_id from cat_product cp join cat c using(cat_id) where c.name="Лыжи" or c.name="Fisher" group by 1 having count(*)=2;


И ещё посмотрите FAQ №16

Неактивен

 

#13 17.07.2013 02:30:08

follow
Участник
Зарегистрирован: 17.07.2013
Сообщений: 9

Re: Составление запроса на выборку по нескольким значениям одного поля

Теме не так много времени, поэтому решил продолжить вопросы по таблице, представленной топикстартером

Возьмем для примера всё ту же таблицу (вначале темы) modelparameter

Запрос

SELECT model_id FROM modelparameter WHERE parameter_value_id IN (1,5) GROUP BY 1 HAVING COUNT(*)=2

отлично работает.
Но что если необходимо выбрать например 5 и 3? Получим:
SELECT model_id FROM modelparameter WHERE parameter_value_id IN (3,5) GROUP BY 1 HAVING COUNT(*)=2

Ведь должно выдать два model_id (1 и 2), но mysql возвращает 0

Понятно, что здесь прокатит такая запись:

SELECT model_id FROM modelparameter WHERE parameter_value_id IN (3,5) GROUP BY 1


...но как это учесть динамически? т.е., в HAVING какую-то проверку дополнительную нужно делать?

Отредактированно follow (17.07.2013 06:11:44)

Неактивен

 

#14 17.07.2013 09:20:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Составление запроса на выборку по нескольким значениям одного поля

Это разные запросы.

SELECT model_id FROM modelparameter WHERE parameter_value_id IN (3,5) GROUP BY 1 HAVING COUNT(*)=2
вернет model_id, которым соответствуют parameter_value_id равные 3 И 5

SELECT model_id FROM modelparameter WHERE parameter_value_id IN (3,5) GROUP BY 1
вернет model_id, которым соответствуют parameter_value_id равные 3 ИЛИ 5

Неактивен

 

#15 17.07.2013 09:24:54

follow
Участник
Зарегистрирован: 17.07.2013
Сообщений: 9

Re: Составление запроса на выборку по нескольким значениям одного поля

vasya написал:

Это разные запросы.

SELECT model_id FROM modelparameter WHERE parameter_value_id IN (3,5) GROUP BY 1 HAVING COUNT(*)=2
вернет model_id, которым соответствуют parameter_value_id равные 3 И 5

SELECT model_id FROM modelparameter WHERE parameter_value_id IN (3,5) GROUP BY 1
вернет model_id, которым соответствуют parameter_value_id равные 3 ИЛИ 5

Да, ошибся...
Но как сделать 3 И 5  чтобы mysql вернула (1 и 2) для нашей задачи?

Отредактированно follow (17.07.2013 09:26:20)

Неактивен

 

#16 17.07.2013 09:40:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Составление запроса на выборку по нескольким значениям одного поля

follow написал:

Но как сделать 3 И 5  чтобы mysql вернула (1 и 2) для нашей задачи?

Этот вопрос взрывает мне мозг.
Условие на 3 И 5 для тестовых данных вернет пустой результат.
Почему должен быть возвращен ответ (1 и 2) ??

Неактивен

 

#17 17.07.2013 10:01:01

follow
Участник
Зарегистрирован: 17.07.2013
Сообщений: 9

Re: Составление запроса на выборку по нескольким значениям одного поля

vasya написал:

follow написал:

Почему должен быть возвращен ответ (1 и 2) ??

...подождите, не взрывайтесь smile
...может я что-то не пониаю
Нам из таблицы нужно выбрать model_id у которых value = 3 AND value = 5

что тут странного? как?

Неактивен

 

#18 17.07.2013 10:08:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Составление запроса на выборку по нескольким значениям одного поля

У model_id =1 есть только value = 5
У model_id =2 есть только value = 3
А вы используете запрос, который выбирает только те model_id каждому из которых одновременно соответствуют value равные 3 И 5.

Неактивен

 

#19 17.07.2013 11:13:21

follow
Участник
Зарегистрирован: 17.07.2013
Сообщений: 9

Re: Составление запроса на выборку по нескольким значениям одного поля

vasya написал:

У model_id =1 есть только value = 5
У model_id =2 есть только value = 3
А вы используете запрос, который выбирает только те model_id каждому из которых одновременно соответствуют value равные 3 И 5.

да, понял, оказывается у меня немного другая структура значений smile
не будем вдаваться в то, как получился такой массив данных...
допустим у меня так:

modelparameter


lot_id     category     param_id     value_id
7     2     4     1671
7     2     4     1672
7     2     4     1671
7     2     4     1672
18     2     4     1671
7     2     4     1671
18     2     4     1672
18     2     4     1671
18     2     4     1672
18     2     4     1671
18     2     4     1672
18     2     4     1671
18     2     4     1671
18     2     4     1671
18     2     4     1671
 



нужно выбрать lot_id где value_id=1671 AND value_id=1672

Неактивен

 

#20 17.07.2013 11:23:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Составление запроса на выборку по нескольким значениям одного поля

SELECT lot_id FROM (SELECT DISTINCT lot_id, value_id FROM modelparameter) t WHERE value_id IN (1671,1672) GROUP BY 1 HAVING COUNT(*)=2;

Неактивен

 

#21 17.07.2013 11:43:32

follow
Участник
Зарегистрирован: 17.07.2013
Сообщений: 9

Re: Составление запроса на выборку по нескольким значениям одного поля

Помогите пожалуйста встроить эту выборку в мою

Та структура данных (пример выше) получилась из такого запроса:


SELECT * from _lots l join _lot_param_values ppv using (lot_id) join _param_values pv using (value_id) WHERE category = '2' AND ppv.param_id=4
 


как мне включить сюда Ваш пример,

всё с той же задачей

нужно выбрать lot_id где value_id=1671 AND value_id=1672

Неактивен

 

#22 17.07.2013 11:48:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Составление запроса на выборку по нескольким значениям одного поля

Вместо modelparameter
подставте
(SELECT * from _lots l join _lot_param_values ppv using (lot_id) join _param_values pv using (value_id) WHERE category = '2' AND ppv.param_id=4) t1

Неактивен

 

#23 17.07.2013 12:19:35

follow
Участник
Зарегистрирован: 17.07.2013
Сообщений: 9

Re: Составление запроса на выборку по нескольким значениям одного поля

Сделал так:


SELECT lot_id FROM (SELECT DISTINCT l.lot_id,ppv.value_id FROM

(SELECT * from _lots l join _lot_param_values ppv using (lot_id) join _param_values pv ON (ppv.value_id=pv.value_id AND ppv.param_id=pv.param_id) WHERE category = '2' AND ppv.param_id=4) t1

) t WHERE ppv.value_id IN (1671,1672) GROUP BY 1 HAVING COUNT(*)=2
 


Ошибка: Duplicate column name 'value_id'

Неактивен

 

#24 17.07.2013 12:28:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Составление запроса на выборку по нескольким значениям одного поля

Вместо DISTINCT l.lot_id,ppv.value_id FROM
DISTINCT lot_id, value_id FROM


Вместо WHERE ppv.value_id IN
WHERE value_id IN

Неактивен

 

#25 17.07.2013 12:58:20

follow
Участник
Зарегистрирован: 17.07.2013
Сообщений: 9

Re: Составление запроса на выборку по нескольким значениям одного поля

vasya написал:

Вместо WHERE ppv.value_id IN
WHERE value_id IN


SELECT lot_id FROM (SELECT DISTINCT lot_id, value_id FROM

(SELECT * from _lots l join _lot_param_values ppv using (lot_id) join _param_values pv ON (ppv.value_id=pv.value_id AND ppv.param_id=pv.param_id) WHERE category = '2' AND ppv.param_id=4) t1

) t WHERE value_id IN (1671,1672) GROUP BY 1 HAVING COUNT(*)=2
 


та же ошибка: Duplicate column name 'value_id'

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson