Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: При проверке более одного параметра выборка не возвращает ничего.
 
 автор: PanCotzky   (05.03.2011 в 02:26)   письмо автору
 
 

Проблема. При проверке более одного параметра выборка не возвращает ничего. При этом если я проверяю на один параметр данного типа (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 - список индивидуальных параметров товаров. Проверка проводится на основе заранее заготовленного списка вариантов, из которых пользователь выбирает, после чего запрос должен вернуть товары, отвечающие этим параметрам.

  Ответить  
 
 автор: cheops   (05.03.2011 в 02:33)   письмо автору
 
   для: PanCotzky   (05.03.2011 в 02:26)
 

Вот это
cpr.type = 'strong'
и вот это условия
cpr.type = 'country'
не могут быть выполнены одновременно по логике AND

PS Условия
cpr.value IN ('1', '2')
и
cpr.value IN ('country')
тоже лучше объединять в одно (это ведь на самом деле логика OR, а так у вас получается, что 'country' исключает возможность выбора из этих трех значений)
cpr.value IN ('1', '2', 'country')

PPS Под новые вопросы лучше заводить новые темы.

  Ответить  
 
 автор: PanCotzky   (05.03.2011 в 02:50)   письмо автору
 
   для: cheops   (05.03.2011 в 02:33)
 

Мне казалось, это непосредственно касается данного вопроса. Просто мне нужно именно, чтобы конкретные параметры соответствовали конкретным значениям. Не будет ли неверным запрос формы (cpr.type IN ('strong', 'country') AND cpr.value IN ('1', '2', 'country'))? Если, к примеру, country = "1", а strong = 'country'?

P.S. всёже стоит перенести этот вопрос в другую тему?

  Ответить  
 
 автор: cheops   (05.03.2011 в 09:31)   письмо автору
 
   для: 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')))

  Ответить  
 
 автор: PanCotzky   (05.03.2011 в 21:59)   письмо автору
 
   для: cheops   (05.03.2011 в 09:31)
 

Ну данная выборка должна отфильтровать данные по определённым критериям. В данном случае нужно выбрать сигареты, произведённые в чётко определённых странах, и имеющие чётко определённую крепость. А так получается, что ЛИБО произведённые в определённой стране, ЛИБО имеющие определённую крепость. Я так понял, что нужно выбрать именно таким образом, а потом уже в PHP их отфильтровать ручками.

  Ответить  
 
 автор: cheops   (06.03.2011 в 14:22)   письмо автору
 
   для: PanCotzky   (05.03.2011 в 21:59)
 

Хм... а как у вас получилось, что за крепкость и за страны отвечают одни и те же поля? Правильно ли я понимаю, что если поле cpr.type принимает значение 'country', то в поле cpr.value будет страна, а если значение 'strong', то крепкость? Если да, то за крепкость и за страны отвечают разные строки таблицы (может это лучше по столбцам раскидать)? Это так или здесь какая-то ошибка в рассуждениях?

  Ответить  
 
 автор: PanCotzky   (06.03.2011 в 20:39)   письмо автору
 
   для: cheops   (06.03.2011 в 14:22)
 

Понимаете, у меня есть таблица непосредственно товаров, в которой описаны общие параметры для всех товаров, а есть таблица доп-параметров, которые различаются в зависимости от типа товаров. Т.е. если мы имеем дело с сигаретами, то у них есть крепость и страна-производитель, а если с кока-колой - тип light, ванильная или обычная. Таблица доп-параметров содержет 2 столбца (кроме уникального id) - индекс владельца параметра, наименование параметра и значение параметра. Т.е. для каждой марки сигарет в этой таблице будет выделено две строки - под крепость и под страну-производитель, а для кока-колы - только одна строка - разновидность. Вот я теперь и пытаюсь реализовать выборку товаров по критерям из этой таблицы.

  Ответить  
 
 автор: cheops   (06.03.2011 в 20:49)   письмо автору
 
   для: PanCotzky   (06.03.2011 в 20:39)
 

Понятно, но тогда вам нужно OR, а не AND иначе запрос не будет ничего возвращать. Ведь помимо типа и значения в таблице дополнительных параметров у вас вероятно предусмотрена связь с таблицей товаров?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования