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

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

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

Вы не зашли.

#1 25.03.2012 14:07:44

arc-one
Участник
Зарегистрирован: 25.03.2012
Сообщений: 6

Помогите написать запрос

Добрый день!
Есть таблица MySql:

id    |    id_product    |    id_property
1    |    1            |    21
2    |    5            |    18
3    |    1            |    23
4    |    2            |    21
5    |    1            |    20
6    |    4            |    12
7    |    2            |    23

Нужно сделать запрос на php, который по заданным одновременно параметрам id_property, например 21 и 23, выдаст все id_product им соответствующие, в данном случае результат должен получиться 1 и 2. Важно сделать это одним запросом. Огромное спасибо!

Неактивен

 

#2 25.03.2012 14:21:28

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

Re: Помогите написать запрос

select distinct id_product from t_5503 where id_property in (21,23) order by 1;


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

Неактивен

 

#3 25.03.2012 15:05:42

arc-one
Участник
Зарегистрирован: 25.03.2012
Сообщений: 6

Re: Помогите написать запрос

Спасибо все работает!)

Неактивен

 

#4 25.03.2012 15:06:27

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

Re: Помогите написать запрос

Код:

mysql> select * from t_5503;
+------+------------+-------------+
| id   | id_product | id_property |
+------+------------+-------------+
|    1 |          1 |          21 |
|    2 |          5 |          18 |
|    3 |          1 |          23 |
|    4 |          2 |          21 |
|    5 |          1 |          20 |
|    6 |          4 |          12 |
|    7 |          2 |          23 |
+------+------------+-------------+
7 rows in set (0.00 sec)

mysql> select distinct id_product from t_5503 where id_property in (21,23) order by 1;
+------------+
| id_product |
+------------+
|          1 |
|          2 |
+------------+
2 rows in set (0.00 sec)

Что касается 18, попробуйте так:

Код:

mysql> select id_product from t_5503 where id_property in (21,23) group by id_product having count(*)=2;
+------------+
| id_product |
+------------+
|          1 |
|          2 |
+------------+
2 rows in set (0.00 sec)

mysql> select id_product from t_5503 where id_property in (21,23,18) group by id_product having count(*)=3;
Empty set (0.00 sec)

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

Неактивен

 

#5 25.03.2012 15:09:37

arc-one
Участник
Зарегистрирован: 25.03.2012
Сообщений: 6

Re: Помогите написать запрос

у меня был цикл выше я провтычил немного, сори, что пришлось тратить дополнительное время(

Неактивен

 

#6 25.03.2012 15:14:56

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

Re: Помогите написать запрос

Ничего страшного smile. Главное - определитесь с тем, какой результат нужно получить. Первый вариант запроса выдаст те продукты, которые соответствуют хотя бы одной из указанных property, а второй вариант - только те, которые привязаны ко всем перечисленным property (в этом случае не должно быть дубликатов в парах (id_product,id_property) ).


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

Неактивен

 

#7 25.03.2012 15:32:01

arc-one
Участник
Зарегистрирован: 25.03.2012
Сообщений: 6

Re: Помогите написать запрос

Второй вариант то что нужно, класс!

Неактивен

 

#8 25.03.2012 16:29:35

arc-one
Участник
Зарегистрирован: 25.03.2012
Сообщений: 6

Re: Помогите написать запрос

2deadka
Думал, что смогу без проблем дописать но на мою писанину все  выдает ошибки...
Как дописать наш запрос, чтобы еще и учитывался параметр id_category с другой таблицы category_tab. Результатом должен быть параметр id_product который отвечает всем известным параметрам например - с первой таблицы 21 и 23, а с category_tab 87, на выходе должен быть 1. По отдельности запросы работают, но совместить их не выходит...

SELECT id_product FROM category_tab WHERE id_category='87' AND id_product =(SELECT * FROM attribites_active WHERE id_property IN (21,23) GROUP BY id_product HAVING COUNT(*)=2)


category_tab

id    |    id_product    |    id_category
1    |    1            |    87
2    |    2            |    34
3    |    1            |    22
4    |    1            |    82

Спасибо!

Отредактированно arc-one (25.03.2012 16:37:09)

Неактивен

 

#9 25.03.2012 22:04:15

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

Re: Помогите написать запрос

Ну, так-то точно нельзя, как Вы написали.
1) SELECT * FROM attribites_active WHERE id_property IN (21,23) GROUP BY id_product HAVING COUNT(*)=2 - Вы группируете по id_product,  а значит на все остальные выбираемые колонки нужно подействовать какой-либо агрегирующей функцией типа max. То есть надо вот так:
SELECT id_product FROM attribites_active WHERE id_property IN (21,23) GROUP BY id_product HAVING COUNT(*)=2

2) Вы пытаетесь сравнить id_product (одну колонку) с множеством колонок (* возвращает все колонки).
То есть во-первых вот так: AND id_product = (SELECT id_product FROM...)
Во-вторых тут надо in вместо равенства, потому что идёт попытка сравнить одну запись со столбцом.

Думаю, что сработает такой запрос:
SELECT id_product FROM category_tab WHERE id_category = 87 AND id_product IN (SELECT id_product FROM attribites_active WHERE id_property IN (21,23) GROUP BY id_product HAVING COUNT(*) = 2) t

Оно?


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

Неактивен

 

#10 26.03.2012 13:47:43

arc-one
Участник
Зарегистрирован: 25.03.2012
Сообщений: 6

Re: Помогите написать запрос

Это очень круто! Все работает) Моей благодарности нет придела!

Неактивен

 

Board footer

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