[英]Searching multiple values in a Comma-Separated MySQL column in a single query
我完全知道在表列中包含定界列表而不是将数据标准化为多个表是多么糟糕 。
虽然,我确实有几年前设计的表格结构,但是我很快会重新设计 。
简化后,它看起来像这样:
Table: Newsletters
+------------+---------------+
| subject | mailing_lists |
+------------+---------------+
| A Test | 1,2 |
| More Tests | 2,3 |
+------------+---------------+
如果愿意,可以在此SQLFiddle中看到它。
最近,我为我的用户提供了写一个分隔列表的邮件列表ID (例如1,3)的选项 ,以选择在视图中显示哪些新闻通讯。
(例如,仅显示已发送到ID为1或3的列表的新闻通讯)
因此: 具有分隔ID列表和分隔ID作为输入的表列。
如果将表格标准化,这显然会容易得多。
因此,我在PHP中解决了这一问题,方法是分解输入id并对其进行迭代,以创建一个查询,就像上面提到的小提琴中的查询一样,如下所示:
SELECT * FROM `newsletters`
WHERE FIND_IN_SET("1", `mailing_lists`) > 0
OR FIND_IN_SET("3", `mailing_lists`) > 0
该查询可以完美地获取我想要获取的数据,但是我只能以编程方式创建它,因为我必须为定界列表中的每个ID添加新条件。
问题是: 出于纯粹的好奇心:是否有一种方法可以避免PHP中的循环,并在不拆分代码中ID的情况下进行查询?
是的,有一种避免循环的方法。 只需规范化数据库结构即可。
表“主题” subjectID(INT(11),auto_increment))| 主题(varchar(255))
表“ MailingLists”的listID(INT(11),auto_increment)| 列表名称
表“ Subjects2Lists”(多对多)subjectID(索引)| listID(索引)
因此,您可以通过执行简单的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.