2017-07-15 63 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