2017-07-15 65 views
0

我有兩個表。創建如下。過濾MySQL根據連接表的字段進行選擇

CREATE TABLE item (
    id INT AUTO_INCREMENT, 
    value VARCHAR(64), 
    PRIMARY KEY(id) 
) 

CREATE TABLE tag (
    name VARCHAR(32), 
    item_id INT /* id of element in item table */ 
) 

我有與「標籤」錶鏈接到表的所有元素一起返回在「項目」表元素的列表的SELECT語句。它在item.value字段的內容上被過濾。

SELECT id,value,GROUP_CONCAT(tag.name) FROM item 
LEFT JOIN tag ON tag.item_id = id 
WHERE value LIKE '%test%' 

目前爲止都不錯。現在我想要做同樣的事情,但是要獲取與它關聯的特定標記的所有項目表元素的列表。所以我

WHERE tag.name='test' 

這給了我所有有來與它一起只包括標籤「測試」標籤「測試」,但分組的標籤列表中的「項目」元素的列表替換WHERE查詢。

如何獲得表'item'中具有tag'test'以及完整組標記列表的所有元素的列表?

回答

1

首先,你應該在你的原始查詢有GROUP BY

SELECT i.id, i.value, GROUP_CONCAT(tag.name) 
FROM item i LEFT JOIN 
    tag t 
    ON t.item_id = i.id 
WHERE i.value LIKE '%test%' 
GROUP BY i.id, i.value 

爲了得到只有具有一定的標籤行,加:

HAVING SUM(t.name = 'test') > 0 

GROUP BY後。

+0

缺乏GROUP BY是一個錯字,但HAVING我沒有嘗試過,它似乎工作,歡呼 – Spads

+1

似乎我也可以使用HAVING SUM(t.name ='test')= 0捕獲物品沒有該標籤解決了我的另一個問題,即它不會返回NOT子句中沒有標籤的項目。乾杯 – Spads