簡體   English   中英

在單個查詢中搜索逗號分隔的MySQL列中的多個值

[英]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的情況下進行查詢?

rakeshjain發表了非常有用的文章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

是的,有一種避免循環的方法。 只需規范化數據庫結構即可。

表“主題” 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM