我完全知道“表”列中的how bad it is to have Delimited Lists,而不是将数据标准化为多个表。

虽然,我确实有几年前设计的表结构,但是我很快会重新设计。
简化后,它看起来像这样:

Table: Newsletters
+------------+---------------+
| subject    | mailing_lists |
+------------+---------------+
| A Test     | 1,2           |
| More Tests | 2,3           |
+------------+---------------+


如果愿意,可以在此SQLFiddle中看到它。

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

因此:具有分隔ID列表和分隔ID作为输入的表列。

如果将表标准化,这显然会容易得多。

因此,我通过分解输入ID并对其进行迭代以创建类似于fiddle mentioned above中的查询的查询来解决此问题,如下所示:

SELECT * FROM `newsletters`
  WHERE FIND_IN_SET("1", `mailing_lists`) > 0
     OR FIND_IN_SET("3", `mailing_lists`) > 0


该查询可以完美地获取我想要获取的数据,但是我只能以编程方式创建它,因为我必须为定界列表中的每个ID添加新条件。

问题是:出于纯粹的好奇心:是否有一种方法可以避免PHP中的循环,并在不拆分代码中ID的情况下进行查询?

最佳答案

rakeshjain非常有用的帖子之后,我设法将查询转换为以下内容:

SELECT * FROM (SELECT *,
               `mailing_lists` REGEXP REPLACE("1,3", ',', '(\\,|$)|')
                  as haslists
               FROM `newsletters` B) A
  WHERE A.haslists = 1


在上面,我假设“ 1,3”是用户提供的值。
这是解决的小提琴:http://sqlfiddle.com/#!2/4621b0/19

谢谢rakeshjain

10-06 05:14
查看更多