我想知道如何检查字符串中的一个或多个元素(本例中为数字),例如"1,2,3,5"是否在另一个字符串中,例如"3,4,5,6'
3和5是该示例中的每个串的公共元素。
在这种情况下,它是基于字符串比较创建SQL查询。数据库中的一个列值包含一个数字字符串,需要与另一个进行比较。我需要与每个字符串的值相匹配的结果。
$results = $db->query("SELECT * FROM db
WHERE comparisonString IN (".$idsString.")
")->fetchAll (PDO::FETCH_ASSOC);
但它并不完全起作用。。。它可以是一个横向的或句法的答案。
更具体地说,只有当comparisonString中的FIRST元素与其他字符串元素匹配时,我才会得到结果。
理想情况下,解决方案看起来像这样:
$results = $db->query("SELECT * FROM db
WHERE ELEMENTS IN comparisonString IN (".$idsString.")
")->fetchAll (PDO::FETCH_ASSOC);
"ELEMENTS IN"是由语法组成的,但这正是我追求的东西
首先,它闻起来像是一个糟糕的模式设计。不要在数据库中存储值的分隔字符串。通过创建多对多表来规范化数据。它将带来巨大的回报,使您能够正常维护和查询您的数据。
同时,如果你使用MySQL,并假设你的表看起来像
CREATE TABLE Table1
(
id int not null auto_increment primary key,
column_name varchar(128)
);
假设你有样本数据
|ID |列名称||----|-------------||1|3,4,5,6||2|4,6,22||3 | 7,5,11||4 | 9,12,1,3||5 | 8,32,16|
如果要从列表1,2,3,5
中选择column_name
包含一个或多个值的所有行,则可以执行
SELECT *
FROM table1
WHERE FIND_IN_SET(1, column_name) > 0
OR FIND_IN_SET(2, column_name) > 0
OR FIND_IN_SET(3, column_name) > 0
OR FIND_IN_SET(5, column_name) > 0
或
SELECT *
FROM table1 t JOIN
(
SELECT id
FROM table1 t JOIN
(
SELECT 1 value UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 5
) s
ON FIND_IN_SET(s.value, t.column_name) > 0
GROUP BY id
) q
ON t.id = q.id
输出(在两种情况下):
|ID |列名称||----|-------------||1|3,4,5,6||3 | 7,5,11||4 | 9,12,1,3|
这是SQLFiddle演示