首页 > 解决方案 > SQL 选择 col1 等于逗号分隔字符串中的值之一的所有行

问题描述

从逗号分隔的字符串中选择多行匹配值。

example 1: A0001,A0002
example 2: A0001,A0003,A0005,A0006
example 3: A0007,A0008,A0009,A0010,A0011,A0012.


Table: Data
col1    col2    col3
--------------------
A0001   A   B
A0002   C   D
A0003   E   F
A0004   G   H
A0005   I   J
A0006   K   L
A0007   M   N
A0008   O   P
A0009   Q   R
A0010   S   T
A0011   U   V
A0012   W   X
A0013   Y   Z

使用或

$sqlData = $this->con->prepare("SELECT col1, col2, col3 
                                FROM data 
                                WHERE col1=A0001 or col2=A0001");
$sqlData->execute();

我不能使用 OR,因为逗号分隔字符串中的值的数量会有所不同。

使用数组

$comaSeperatedString = "A0007,A0008,A0009,A0010,A0011,A0012";
col1_arr = explode(",", $comaSeperatedString);

foreach (col1_arr as dataItem) {
    $sqlData = $this->con->prepare("SELECT col1, col2, col3 
                                    FROM data 
                                    WHERE col1=dataItem");
    $sqlData->execute();
    echo col1;
    echo col2;
    echo col3;
}

我可以将逗号分隔的字符串推送到一个数组中,然后使用 foreach 循环遍历数组,为每个实例运行查询。然而,这似乎草率和浪费。

我想选择 col1 等于逗号分隔字符串中的值之一的所有行。

这可以在一个简单的 SQL 语句中完成吗?

标签: phpmysql

解决方案


您可以使用FIND_IN_SET()which 返回项目在逗号分隔列表中的位置,或者0如果未找到:

$comaSeperatedString = "A0007,A0008,A0009,A0010,A0011,A0012";

$query = $this->con->prepare('SELECT col1, col2, col3 FROM data WHERE FIND_IN_SET(col1, :values)');
$query->bindParam(':values', $comaSeperatedString);
$query->execute();

推荐阅读