|
|
|
| Проблема. При проверке более одного параметра выборка не возвращает ничего. При этом если я проверяю на один параметр данного типа (name = 'N' AND value IN ('M', 'O')), и один параметр просто (distributor = 'K'), всё работает, а если в выборке присутствует более одного параметра первого типа - результат пустой. Вот текст запроса:
SELECT `prd`.`id` AS `prd_id`, `prd`.`name` AS `prd_name`,
`prd`.`info` AS `prd_info`, `prd`.`keyword` AS `prd_keyword`,
`prd`.`price` AS `prd_price`, `prd`.`product_id` AS `prd_product_id`,
`prd`.`country` AS `prd_country`, `cpr`.`ovner_id` AS `cpr_ovner_id`,
`cpr`.`value` AS `cpr_value`, `cpr`.`type` AS `cpr_type`
FROM `tb_catalog` AS `prd`
LEFT JOIN `tb_custom_params` AS `cpr` ON prd.product_id = cpr.ovner_id
WHERE (keyword IN (SELECT `typ`.`name`
FROM `tb_types` AS `typ`
WHERE (left_key >= '4') AND (right_key <= '5')))
AND (prd.distributor IN ('gsc'))
AND (cpr.type = 'strong' AND cpr.value IN ('1', '2'))
AND (cpr.type = 'country' AND cpr.value IN ('country'))
GROUP BY `prd`.`product_id`
|
Таблица tb_catalog - товары, таблица tb_custom_params - список индивидуальных параметров товаров. Проверка проводится на основе заранее заготовленного списка вариантов, из которых пользователь выбирает, после чего запрос должен вернуть товары, отвечающие этим параметрам. | |
|
|
|
|
|
|
|
для: PanCotzky
(05.03.2011 в 02:26)
| | Вот это
и вот это условияне могут быть выполнены одновременно по логике AND
PS Условия
и
тоже лучше объединять в одно (это ведь на самом деле логика OR, а так у вас получается, что 'country' исключает возможность выбора из этих трех значений)
cpr.value IN ('1', '2', 'country')
|
PPS Под новые вопросы лучше заводить новые темы. | |
|
|
|
|
|
|
|
для: cheops
(05.03.2011 в 02:33)
| | Мне казалось, это непосредственно касается данного вопроса. Просто мне нужно именно, чтобы конкретные параметры соответствовали конкретным значениям. Не будет ли неверным запрос формы (cpr.type IN ('strong', 'country') AND cpr.value IN ('1', '2', 'country'))? Если, к примеру, country = "1", а strong = 'country'?
P.S. всёже стоит перенести этот вопрос в другую тему? | |
|
|
|
|
|
|
|
для: PanCotzky
(05.03.2011 в 02:50)
| | А почему так получилось, что они стали взаимоисключающими? Может вместо AND между наборами параметров в круглых скобках нужен OR? Т.е. вот этот фрагмент
(cpr.type = 'strong' AND cpr.value IN ('1', '2'))
AND (cpr.type = 'country' AND cpr.value IN ('country'))
|
Заменить на
((cpr.type = 'strong' AND cpr.value IN ('1', '2'))
OR (cpr.type = 'country' AND cpr.value IN ('country')))
|
| |
|
|
|
|
|
|
|
для: cheops
(05.03.2011 в 09:31)
| | Ну данная выборка должна отфильтровать данные по определённым критериям. В данном случае нужно выбрать сигареты, произведённые в чётко определённых странах, и имеющие чётко определённую крепость. А так получается, что ЛИБО произведённые в определённой стране, ЛИБО имеющие определённую крепость. Я так понял, что нужно выбрать именно таким образом, а потом уже в PHP их отфильтровать ручками. | |
|
|
|
|
|
|
|
для: PanCotzky
(05.03.2011 в 21:59)
| | Хм... а как у вас получилось, что за крепкость и за страны отвечают одни и те же поля? Правильно ли я понимаю, что если поле cpr.type принимает значение 'country', то в поле cpr.value будет страна, а если значение 'strong', то крепкость? Если да, то за крепкость и за страны отвечают разные строки таблицы (может это лучше по столбцам раскидать)? Это так или здесь какая-то ошибка в рассуждениях? | |
|
|
|
|
|
|
|
для: cheops
(06.03.2011 в 14:22)
| | Понимаете, у меня есть таблица непосредственно товаров, в которой описаны общие параметры для всех товаров, а есть таблица доп-параметров, которые различаются в зависимости от типа товаров. Т.е. если мы имеем дело с сигаретами, то у них есть крепость и страна-производитель, а если с кока-колой - тип light, ванильная или обычная. Таблица доп-параметров содержет 2 столбца (кроме уникального id) - индекс владельца параметра, наименование параметра и значение параметра. Т.е. для каждой марки сигарет в этой таблице будет выделено две строки - под крепость и под страну-производитель, а для кока-колы - только одна строка - разновидность. Вот я теперь и пытаюсь реализовать выборку товаров по критерям из этой таблицы. | |
|
|
|
|
|
|
|
для: PanCotzky
(06.03.2011 в 20:39)
| | Понятно, но тогда вам нужно OR, а не AND иначе запрос не будет ничего возвращать. Ведь помимо типа и значения в таблице дополнительных параметров у вас вероятно предусмотрена связь с таблицей товаров? | |
|
|
|