我想顯示記錄有多個類別的位置,儘管我的查詢只顯示第一個實例。我需要查詢中顯示域多次爲它出現的每個類別中通過逗號分隔SQL列where條款
的SQL語句我是
SELECT domains.*, category.*
FROM domains,category
WHERE category.id IN (domains.category_id)
這給了我下面的結果
我想顯示記錄有多個類別的位置,儘管我的查詢只顯示第一個實例。我需要查詢中顯示域多次爲它出現的每個類別中通過逗號分隔SQL列where條款
的SQL語句我是
SELECT domains.*, category.*
FROM domains,category
WHERE category.id IN (domains.category_id)
這給了我下面的結果
您不應該將數字值存儲在字符串中。糟糕,糟糕的主意。您應該使用適當的聯結表和正確的SQL結構。
有時,我們被其他人的糟糕的設計決定所困擾。 MySQL提供find_in_set()
以幫助解決這種情況:
where find_in_set(category.id, domains.category_id) > 0
使用find_in_set()。
SELECT domains.*, category.*
FROM domains,category
WHERE find_in_set (category.id ,domains.category_id)
但它是非常糟糕的數據庫設計存儲fk作爲一個csv。
正如其他人指出的那樣,您可以使用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;
好主意生病將所有東西都映射到聯結表 –