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