SQL Query несколько AND и OR не работают

У меня есть ячейка, которая содержит значения, разделенные двойной трубой. Я пытаюсь найти содержимое этой ячейки следующим образом (где 10 – номер для поиска)% 10, 10%,% 10% и 10

Мой запрос, кажется, только возвращает 10. ни один из других вариантов. Может кто-нибудь, пожалуйста, сообщите мне, почему он не работает?

Спасибо заранее. (SQL-запрос, который вы видите ниже, является тем, что экспортируется из подготовленного запроса запроса PDO)

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` = '1' ) AND `Hat`.`colorId` = '%||10||%' OR `Hat`.`colorId` = '10||%' OR `Hat`.`colorId` = '%||10' OR `Hat`.`colorId` = '10' ) LIMIT 0 , 30 

Я думаю, что вы должны использовать LIKE вместо =:

 AND `Hat`.`colorId` LIKE '%||10||%' OR `Hat`.`colorId` LIKE '10||%' OR `Hat`.`colorId` LIKE '%||10' OR `Hat`.`colorId` = '10' 

Для wildcart вы должны использовать LIKE
Попробуй это:

  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` = '1' ) AND `Hat`.`colorId` LIKE '%||10||%') OR `Hat`.`colorId` LIKE '10||%' OR `Hat`.`colorId` LIKE '%||10' OR `Hat`.`colorId` LIKE '10' ) LIMIT 0 , 30 

Можете ли вы попробовать это, Кроме того, для лучших результатов – добавлено () для всех OR т.е. группировка

 WHERE ( ( `Hat`.`published` =1 AND `Hat`.`collectionId` = '1' ) AND ( `Hat`.`colorId` LIKE '%||10||%' ....^ OR `Hat`.`colorId` LIKE '10||%' OR `Hat`.`colorId` LIKE '%||10' OR `Hat`.`colorId` = '10' ) ..^ ) LIMIT 0 , 30 

Посмотрите на эту запущенную скрипту sql на основе вашей схемы / данных / запроса: http://sqlfiddle.com/#!2/48da8/3

Вы должны использовать оператор LIKE и правильно поместить свою скобку в соответствии с приоритетом AND и 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 = '1' AND ( Hat.colorid LIKE '%||10||%' OR Hat.colorid LIKE '10||%' OR Hat.colorid LIKE '%||10' OR Hat.colorid LIKE '10' ) LIMIT 0, 30 

Обратный кадр не нужен, если вы не используете символы с ограниченным именем, такие как символ пробела.

Я считаю, что вы хотите:

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

Обратите внимание, что я удалил обратные элементы из всех определений вашей таблицы и столбца, кроме «типа», который является зарезервированным словом.

вам нужно избежать символа процента

ответ на этот вопрос должен показать вам, как это сделать.


Вы также можете создать такой запрос

 SELECT * FROM HatTable WHERE colorId LIKE '%10%' 

это должно дать вам все варианты, в которых есть 10.

Обновить

Это даст вам все, что имеет 10 в нем. так что это, вероятно, не то, что вы ищете.

Примеры выбора с использованием вышеуказанного запроса

  • 3210

  • || 10 ||

  • || 10

  • 10 ||

  • 10

  • 1032

  • 435262 10 32456234