我完全知道“表”列中的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
!