是否可以与“WHERE IN”查询中的值完全匹配?

时间:2013-04-04 19:54:56

标签: mysql where

我有一张有这种结构的表格:

ID | level1 | level2 | level3

每个字段都存储一个整数。然后我有一个这样的数组:$ array(1,2,8,9,15)

我希望在任何字段level1,level2或level3中获取包含数组值的所有行。

我试试这个:

SELECT P.* FROM table P 
WHERE level1 OR level2 OR level3 IN (".$array.")

问题是,如果数组包含例如数字1,则查询获取10,11,12的行......

有没有办法让价值完全匹配?

3 个答案:

答案 0 :(得分:3)

问题不在于你的想法。如前所述,您的查询将返回level1!= 0 OR level2!= 0或者level3在列表中的任何行,因为level1和level2被评估为布尔值。

您需要有3个单独的IN子句,如下所示:

SELECT P.* 
FROM table P 
WHERE level1 IN (...) 
OR level2 IN (...) 
OR level3 IN (...) 

答案 1 :(得分:1)

IN选择器要求并精确匹配数组中的一个值。你这里有几个问题。首先,您不能使用OR,就像您使用不需要为每个字段指定IN一样:

SELECT P.* FROM table P 
WHERE
level1 IN (...)
OR level2 IN (...)
OR level3 IN (...)

其次,你不能像对待这样的东西一样回应你的数组:

$in_string = "'" . implode("','", $array) . "'";
$query = "SELECT P.* FROM table P 
    WHERE
    level1 IN ($in_string)
    OR level2 IN ($in_string)
    OR level3 IN ($in_string)";

答案 2 :(得分:0)

您可以使用FIND_IN_SET

SELECT P.* FROM P 
WHERE
  FIND_IN_SET(level1, '".$array."') OR
  FIND_IN_SET(level2, '".$array."') OR
  FIND_IN_SET(level3, '".$array."')

请参阅小提琴here