[英]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.