php中的字符串比较(用于创建sql查询)


string comparisons in php (to create a sql query)

我想知道如何检查字符串中的一个或多个元素(本例中为数字),例如"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演示