Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день!
Есть таблица 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. Важно сделать это одним запросом. Огромное спасибо!
Неактивен
select distinct id_product from t_5503 where id_property in (21,23) order by 1;
Неактивен
Спасибо все работает!)
Неактивен
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)
Неактивен
у меня был цикл выше я провтычил немного, сори, что пришлось тратить дополнительное время(
Неактивен
Ничего страшного . Главное - определитесь с тем, какой результат нужно получить. Первый вариант запроса выдаст те продукты, которые соответствуют хотя бы одной из указанных property, а второй вариант - только те, которые привязаны ко всем перечисленным property (в этом случае не должно быть дубликатов в парах (id_product,id_property) ).
Неактивен
Второй вариант то что нужно, класс!
Неактивен
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)
Неактивен
Ну, так-то точно нельзя, как Вы написали.
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
Оно?
Неактивен
Это очень круто! Все работает) Моей благодарности нет придела!
Неактивен