0

我有一个具有这种结构的表:

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 的行...

有没有办法使值完全匹配?

4

3 回答 3

3

问题不是你想的那样。如目前所写,您的查询将返回列表中 level1 != 0 OR level2 != 0 OR level3 的任何行,因为 level1 和 level2 被评估为布尔值。

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

SELECT P.* 
FROM table P 
WHERE level1 IN (...) 
OR level2 IN (...) 
OR level3 IN (...) 
于 2013-04-04T20:03:18.580 回答
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)";
于 2013-04-04T22:29:43.623 回答
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."')

在此处查看小提琴。

于 2013-04-04T20:00:09.533 回答