2017-07-15 26 views
0

私は2つのテーブルを持っています。以下のように作成されます。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クエリを置き換えます。

タグ 'test'を持つテーブル 'item'の全要素のリストを、完全なグループタグリストと一緒に取得するにはどうすればよいですか?

答えて

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の欠如はタイプミスでしたが、試していないし、うまくいきました。歓声 – Spads

+1

HAVING SUM(t.name = 'test')= 0を使用すると、 NOT句にタグがない項目を返さない別の問題を解決するタグ。乾杯 – Spads

関連する問題