Php 在单个查询中搜索逗号分隔的MySQL列中的多个值

Php 在单个查询中搜索逗号分隔的MySQL列中的多个值,php,mysql,sql,Php,Mysql,Sql,我完全了解在一个表列中,而不是将数据规范化为多个表 尽管如此,我确实在多年前设计了一个表结构,我很快就会重新设计它。 简而言之,它看起来是这样的: Table: Newsletters +------------+---------------+ | subject | mailing_lists | +------------+---------------+ | A Test | 1,2 | | More Tests | 2,3 | +-

完全了解在一个表列中,而不是将数据规范化为多个表

尽管如此,我确实在多年前设计了一个表结构,我很快就会重新设计它。
简而言之,它看起来是这样的:

Table: Newsletters
+------------+---------------+
| subject    | mailing_lists |
+------------+---------------+
| A Test     | 1,2           |
| More Tests | 2,3           |
+------------+---------------+ 
SELECT * FROM `newsletters`
  WHERE FIND_IN_SET("1", `mailing_lists`) > 0
     OR FIND_IN_SET("3", `mailing_lists`) > 0
如果你愿意,你可以在这里看到

最近,我给我的用户提供了一个选项,可以编写一个以分隔的邮件列表ID列表(如1,3),作为选择在视图中显示哪些新闻稿的功能。
(例如,仅显示发送到id为1或3的列表的新闻稿)

因此:一个表列,其中包含分隔的ID列表,并将分隔的ID作为输入。

如果表被规范化,这显然会容易得多

因此,我在PHP中解决了这个问题,通过分解输入ID并迭代它们来创建一个类似于中的查询,如下所示:

Table: Newsletters
+------------+---------------+
| subject    | mailing_lists |
+------------+---------------+
| A Test     | 1,2           |
| More Tests | 2,3           |
+------------+---------------+ 
SELECT * FROM `newsletters`
  WHERE FIND_IN_SET("1", `mailing_lists`) > 0
     OR FIND_IN_SET("3", `mailing_lists`) > 0
这个查询完美地获取了我想要获取的数据,但我只能以编程方式创建它,因为我必须为分隔列表中的每个id添加一个新条件


问题是:纯粹出于好奇:有没有一种方法可以避免PHP中的循环,并且在不拆分代码中的ID的情况下进行查询?是的,有一种方法可以避免循环。只需规范化您的数据库结构

表“主题” 主语(INT(11),自动递增)|主语(varchar(255))

表“邮件列表” listID(INT(11),自动递增)| listName

表“主题2列表”(多对多) 主题(索引)|列表ID(索引)

因此,您可以通过执行简单的select/join语句来获取每个列表ID

SELECT 
    list.listID, 
    names.listName 
FROM 
    Subject2Lists AS list 
LEFT JOIN 
    MailingLists AS names 
    ON (list.listID = names.listID) 
WHERE 
    subjectID = 1 

rakeshjain
发表了一篇非常有用的文章之后,我设法将我的查询转换为:

SELECT * FROM (SELECT *,
               `mailing_lists` REGEXP REPLACE("1,3", ',', '(\\,|$)|')
                  as haslists
               FROM `newsletters` B) A
  WHERE A.haslists = 1
在上面,我假设“1,3”是用户提供的值。
以下是解决的难题:


谢谢你
rakeshjain

我已经在我的问题上发布了这个事实,马塞尔,但是谢谢你的努力。嗯。。。对不起。我认为这对其他人来说是好的,为了避免您的特定问题,我将创建一个存储过程,并将邮件列表的ID作为参数。因此,您可以在ids中进行迭代,创建一个完整的语句并执行它。不过,我会规范我的表结构,因为我正在计划一个大的更新,但我认为值得一试问这个问题。试试这个链接