2014-01-14 3 views
0

У меня есть запрос, указанный ниже, из выписки из PDO. Все в запросе отлично работает, кроме collectionId = 3. Его возвращающиеся результаты с другими интергерами ...mysql-запрос не фильтрует И как ожидалось

Я уставился на это некоторое время и не могу понять, что не так, все это выглядит хорошо для меня?

SELECT `Hat`.`id` AS `Hat_id` , `Hat`.`hatCode` AS `Hat_hatCode` , `Hat`.`hatCodeOther` AS `Hat_hatCodeOther` , `Hat`.`name` AS `Hat_name` , `Hat`.`description` AS `Hat_description` , `Hat`.`colorId` AS `Hat_colorId` , `Hat`.`collectionId` AS `Hat_collectionId` , `Hat`.`mainPicture` AS `Hat_mainPicture` , `Hat`.`subPicture` AS `Hat_subPicture` , `Hat`.`type` AS `Hat_type` , `Hat`.`featured` AS `Hat_featured` , `Hat`.`published` AS `Hat_published` , `Hat`.`deleted` AS `Hat_deleted` 
FROM `modx_hats` AS `Hat` 
WHERE (
`Hat`.`published` =1 
AND `Hat`.`collectionId` = '3' 
AND `Hat`.`colorId` LIKE '%||2||%' 
OR `Hat`.`colorId` LIKE '2||%' 
OR `Hat`.`colorId` LIKE '%||2' 
OR `Hat`.`colorId` LIKE '2' 
) 
LIMIT 0 , 30 
+0

ЗАКАНЧИВАТЬ SQL оператора precendence и этот вопрос: http://stackoverflow.com/questions/1241142/sql-logic-operator-precedence-and- и-или – vbo

+0

возможный дубликат [SQL Query multiple AND и OR не работает] (http://stackoverflow.com/questions/21096134/sql-query-multiple-and-and-ors-not-working) – codeling

ответ

1

Ваш OR условия должны быть в скобках:

SELECT `Hat`.`id` AS `Hat_id` , `Hat`.`hatCode` AS `Hat_hatCode` , `Hat`.`hatCodeOther` AS `Hat_hatCodeOther` , `Hat`.`name` AS `Hat_name` , `Hat`.`description` AS `Hat_description` , `Hat`.`colorId` AS `Hat_colorId` , `Hat`.`collectionId` AS `Hat_collectionId` , `Hat`.`mainPicture` AS `Hat_mainPicture` , `Hat`.`subPicture` AS `Hat_subPicture` , `Hat`.`type` AS `Hat_type` , `Hat`.`featured` AS `Hat_featured` , `Hat`.`published` AS `Hat_published` , `Hat`.`deleted` AS `Hat_deleted` 
FROM `modx_hats` AS `Hat` 
WHERE (
`Hat`.`published` =1 
AND `Hat`.`collectionId` = '3' 
AND (`Hat`.`colorId` LIKE '%||2||%' 
OR `Hat`.`colorId` LIKE '2||%' 
OR `Hat`.`colorId` LIKE '%||2' 
OR `Hat`.`colorId` LIKE '2') 
) 
LIMIT 0 , 30 
+0

Это было оно - спасибо, поскольку это был первый правильный ответ, я соглашусь с этим, когда мне разрешат. Выберет все остальные, хотя :) –

1

Вы можете попробовать это, Добавлено () для OR группировки

WHERE (
`Hat`.`published` =1 
AND `Hat`.`collectionId` = '3' 
AND (`Hat`.`colorId` LIKE '%||2||%' 
OR `Hat`.`colorId` LIKE '2||%' 
OR `Hat`.`colorId` LIKE '%||2' 
OR `Hat`.`colorId` LIKE '2' 
) 
) 

Ref: SQL Query multiple AND and OR's not working

0

Вы надеваете» t укажите, что именно вы хотели бы фильтровать, но ваша проблема, скорее всего, заключается в том, что условия ge t оценивается иначе, чем вы думаете. Как вы ожидаете, что OR и AND (которые не имеют круглых скобок для их группировки) оцениваются?

Как можно заметить, что запрос возвращает все записи, которые удовлетворяют ЯВНО

`Hat`.`published` =1 AND 
`Hat`.`collectionId` = '3' AND 
`Hat`.`colorId` LIKE '%||2||%' ` 

ИЛИ которые выполняют какие-либо из этих других ограничений:

OR `Hat`.`colorId` LIKE '2||%' 
OR `Hat`.`colorId` LIKE '%||2' 
OR `Hat`.`colorId` LIKE '2' 

Это весь вопрос установки скобки правильно. Я предполагаю, что вы хотите, чтобы все записи, опубликованные = 1, collectionId = 3, и один из цветов, которые вы даете. Для этого, вы должны сгруппировать его соответствующим образом:

WHERE (
`Hat`.`published` =1 
AND `Hat`.`collectionId` = '3' 
AND 
    (
    `Hat`.`colorId` LIKE '%||2||%' 
    OR `Hat`.`colorId` LIKE '2||%' 
    OR `Hat`.`colorId` LIKE '%||2' 
    OR `Hat`.`colorId` LIKE '2' 
) 
) 
Смежные вопросы