2011-12-07 10 views
2

私は記事のセットを持っています。これらの記事のいくつかにはx個のタグが割り当てられています。MySQL:オプションでビルドグループの連結フィールド

SELECTに指定されている書式の記事をすべて選択し、記事にもいくつでもタグが割り当てられている場合は、それらを単一のGROUP_CONCATフィールドに入れます。

以下のSQLはそれだけで少なくとも一つのタグを持って記事を取得除いて、私は必要なすべてを、行います。

タグ付けの要件がオプションであるようにするにはどうすればよいですか?

SELECT d.entry_id AS entry_id 
    , d.field_id_40 AS body 
    , t.title AS title 
    , t.url_title AS url_title 
    , t.entry_date AS entry_date 
    , GROUP_CONCAT(g.tag_name ORDER BY g.tag_name) AS tag 
FROM exp_channel_data d 
    , exp_category_posts c 
    , exp_channel_titles t 
    , exp_tagger_links l 
    , exp_tagger g 
WHERE t.YEAR > '2005' 
    AND t.site_id = d.site_id 
    AND d.site_id = 9 
    AND (c.cat_id = 95 
     OR c.cat_id = 93 
     OR c.cat_id = 64 
     OR c.cat_id = 24 
    ) 
    AND d.entry_id = t.entry_id 
    AND t.entry_id = c.entry_id 
    AND t.STATUS = 'open' 
    AND l.tag_id = g.tag_id 
    AND d.entry_id = l.entry_id 
GROUP BY d.entry_id 
+3

使用' JOIN'を見てみたいことがあります。それでは、あなたの問題を解決するために 'INNER JOIN'を' LEFT JOIN'に変更するのは簡単でしょう。 –

答えて

3

JOINの構文を使用するようにJOINSを切り替えると、あなたの答えが表示されます。

SELECT d.entry_id AS entry_id 
    , d.field_id_40 AS body 
    , t.title AS title 
    , t.url_title AS url_title 
    , t.entry_date AS entry_date 
    , GROUP_CONCAT(g.tag_name ORDER BY g.tag_name) AS tag 
FROM exp_channel_data AS d 
INNER JOIN exp_channel_titles AS t ON d.site_id = t.site_id 
    AND d.entry_id = t.entry_id 
INNER JOIN exp_category_posts AS c ON t.entry_id = c.entry_id 
LEFT OUTER JOIN exp_tagger_links AS l ON d.entry_id = l.entry_id 
LEFT OUTER JOIN exp_tagger AS g ON l.tag_id = g.tag_id 
WHERE t.YEAR > '2005' 
    AND d.site_id = 9 
    AND c.cat_id IN (95, 93, 64, 24) 
    AND t.STATUS = 'open' 
GROUP BY d.entry_id 

はまた、 `WHERE`、あなたのテーブルの結合ではないためA visual explanation of SQL joins.

関連する問題