我有一张有这种结构的表格:
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的行......
有没有办法让价值完全匹配?
答案 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。