MySQL - 包含多个值

时间:2018-02-12 21:23:51

标签: php mysql

我有两个MySQL表(规范化),包含以下数据:

Customer Type:
+------------------+---------------------+
| customer_type_id |     description     |
|        1         |       customer      |
|        2         |   former customer   |
|        3         |      prospect       |
|        4         | center of influence |
+------------------+---------------------+

Queue:
+----------+------------------+---------+------------+
| queue_id | customer_type_id | user_id | send_date  |
|     1    |         1        |    1    | 2018-02-12 |
|     2    |         1        |    2    | 2018-01-01 |
|     3    |         4        |    1    | 2018-01-01 |
+----------+------------------+---------+------------+

我想查询Queue表,但我允许用户过滤多个customer_type_id值。我知道我可以在WHERE子句中使用多个条件,如下所示:

WHERE
  `user_id` = 1 AND
  (`customer_type_id` = 1 OR
  `customer_type_id` = 4)

但是因为我在后端使用PHP,通过AJAX请求发送数据,HTML标记如下所示:<select name="customers[]">,我想知道是否有办法只需将PHP数组作为参数传递给SQL命令,类似于以下伪代码:

WHERE
  `user_id` = 1 AND
  `customer_type_id` CONTAINS [1, 4]

这样做的原因是我宁愿实现内置的MySQL方法,而不是在运行时构建动态SQL命令。

4 个答案:

答案 0 :(得分:0)

如何在?

中使用PHP函数implode和SQL
WHERE customer_type_id IN (implode(',', $_GET['customers']))

答案 1 :(得分:0)

您可以使用SQL IN()

从数组生成String

参见示例:

$string = join(", ", $array);
$sql = "SELECT * FROM ... WHERE customer_type_id IN (".$string.")

如果您想添加字符串,则必须通过for循环替换连接,如

$string = "";
$i = 0;
foreach($array as $value) {
   if($i > 0) 
     $string += ", ";
   $string += "'".$value."'";
}
$sql = "SELECT * FROM ... WHERE column IN (".$string.")";

答案 2 :(得分:0)

最好的选择是将MySQL IN clause 与PHP数组结合使用:

$valus = array(1, 4);
$query = "SELECT * FROM `Queue` WHERE `user_id` = 1
           AND `customer_type_id` IN (" + $values + ")";

哪个被评估为可以独立于PHP使用的原始MySQL:

SELECT * FROM `Queue` WHERE `user_id` = 1 AND `customer_type_id` IN (1, 4)

或者,如果您要选择范围内的任何值,可以使用 BETWEEN clause

SELECT * FROM `Queue` WHERE `user_id` = 1 AND `customer_type_id` BETWEEN 1 AND 4

希望这有帮助!

答案 3 :(得分:0)

正如其他人所建议的那样,使用IN ()谓词。这在逻辑上等同于您展示的多个术语使用OR

请参阅https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_in

但是你应该小心防止SQL注入。如果您只是使用PHP implode()来组合一个不安全的请求参数,那么您就有风险。

您可以将(@)投射到int

的值内爆()
$cust_type_list = implode(',', array_map('intval', $_GET['customers']));
$sql = "...WHERE customer_type_id IN ($cust_type_list);

或者您可以使用与查询数量相同的SQL查询参数:

$cust_types = (array) $_GET['customers'];
$placeholders = implode(',', array_fill(1, count($cust_types), '?'));
$sql = "...WHERE customer_type_id IN ($placeholders);
$stmt = $pdo->prepare($sql);
$stmt->execute($cust_types);