2015-07-28 39 views
2

我想顯示記錄有多個類別的位置,儘管我的查詢只顯示第一個實例。我需要查詢中顯示域多次爲它出現的每個類別中通過逗號分隔SQL列where條款

的SQL語句我是

SELECT domains.*, category.* 
FROM domains,category 
WHERE category.id IN (domains.category_id) 

這給了我下面的結果

enter image description here

回答

2

您不應該將數字值存儲在字符串中。糟糕,糟糕的主意。您應該使用適當的聯結表和正確的SQL結構。

有時,我們被其他人的糟糕的設計決定所困擾。 MySQL提供find_in_set()以幫助解決這種情況:

where find_in_set(category.id, domains.category_id) > 0 
+0

好主意生病將所有東西都映射到聯結表 –

2

使用find_in_set()。

SELECT domains.*, category.* 
FROM domains,category 
WHERE find_in_set (category.id ,domains.category_id) 

但它是非常糟糕的數據庫設計存儲fk作爲一個csv。

0

正如其他人指出的那樣,您可以使用FIND_NI_SET()作爲解決方法來解決您的問題。

我的建議是你重構你的代碼和數據庫。以CSV格式存儲存儲在單個列中的值幾乎總是一個壞主意。 正如戈登·利諾夫正確地指出,你會更好,如果你想創建一個額外的表來存儲category_id值:

CREATE TABLE domain_categories (domain_id INT, category_id INT, PRIMARY KEY (domain_id, category_id)); 

這是假設你想enfore表示,對每個域中的每個類別只存儲一次。如果你不這樣做,只需放下主鍵。

然後你會插入您的ID添加到這個新表:

INSERT INTO domain_categories (domain_id, category_id) VALUES (2,6),(2,8); 

INSERT INTO domain_categories (domain_id, category_id) VALUES (4,3); 
INSERT INTO domain_categories (domain_id, category_id) VALUES (4,11); 
INSERT INTO domain_categories (domain_id, category_id) VALUES (20,3); 

既然你已經妥善保存您可以輕鬆地查詢的數據需要:

SELECT domains.*,category,* 
FROM domains 
    JOIN domain_category ON (domain_category.domain_id=domains.id) 
    JOIN category ON (category.id=domain_category.category_id); 

使用MySQL怪癖,你甚至可以顯示CSV格式的category_id列。

SELECT domains.*, GROUP_CONCAT(DISTINCT domain_category.category_id) 
FROM domains 
    JOIN domain_category ON (domain_category.domain_id=domains.id) 
GROUP BY domains.id;