SQL查询多个AND和OR不起作用

时间:2014-01-13 16:19:51

标签: php mysql sql pdo

我有一个包含由双管分隔的值的单元格。我正在尝试使用以下内容搜索此单元格的内容,(其中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

6 个答案:

答案 0 :(得分:10)

我认为您应该使用LIKE而不是=:

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

答案 1 :(得分:3)

对于野外车,您应该使用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

答案 2 :(得分:2)

你能试试吗,另外,为了获得更好的结果,为所有()添加了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

答案 3 :(得分:2)

根据你的架构/数据/查询看看这个运行的sql小提琴: http://sqlfiddle.com/#!2/48da8/3

您应该使用LIKE运算符,并根据ANDOR优先级正确设置括号。此外,清理您的查询,它看起来像这样:

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 

只要您不使用受限制的命名字符(如空格字符),就不需要反引号。

答案 4 :(得分:1)

我相信你想要的是:

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

请注意,我从所有表和列定义中删除了反引号,但“type”是保留字。

答案 5 :(得分:1)

你需要逃避百分比符号

这个question的答案应该告诉你如何做到这一点。


你也可以像这样创建一个

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

这应该会为你提供包含10个选项的所有选项。

<强>更新

这将为您提供包含10的任何内容。所以这可能不是你想要的。

使用上述查询进行选择的示例

  • 3210

  • || || 10

  • || 10

  • 10 ||

  • 10

  • 1032

  • 435262 10 32456234