MySQLの GROUP CONCAT で記事一覧にタグの情報をつけて出力してみる
おはようございます。
以前、WordPressの記事一覧を抽出する方法を記事にしましたが、
今回はそれにタグの情報も加えてみたいと思います。
前回の記事も参考にしてください。
スポンサーリンク
GROUP CONCAT 関数
GROUP BY でデータを集約する際に、
指定したカラムを(区切り文字で)連結、文字列データとして出力できる関数。
例えば次のようなテーブルを
| NO | 所属 | 従業員 |
|---|---|---|
| 1 | 部門1 | 社員1 |
| 2 | 部門1 | 社員2 |
| 3 | 部門1 | 社員3 |
| 4 | 部門2 | 社員4 |
| 5 | 部門2 | 社員5 |
所属でグルーピングして従業員を連結することができます。
SELECT 所属 GROUP_CONCAT(従業員) FROM SAMPLE
抽出結果
| 所属 | 従業員 |
|---|---|
| 部門1 | 社員1,社員2,社員3 |
| 部門2 | 社員4,社員5 |
データのエクスポート
タグを出力するクエリ
select
p.id
, group_concat(t.name order by t.name) as tag
from
wp_terms t
left outer join wp_term_taxonomy x on (
t.term_id = x.term_id
)
left outer join wp_term_relationships r on (
x.term_taxonomy_id = r.term_taxonomy_id
)
left outer join wp_posts p on (
r.object_id = p.id
)
where
x.taxonomy = 'post_tag'
group by
p.id, p.post_title抽出結果
記事一覧にタグをつけて出力するクエリ
select
p.id
, REPLACE(p.post_date, "-", "/") as post_date
, REPLACE(p.post_modified, "-","/") as post_modified
, concat('ルートURL', date_format(p.post_date, '%Y'), '/', date_format(p.post_date, '%m'), '/', date_format(p.post_date, '%d'), '/', p.post_name, '/') as post_name
, p.post_title
, IFNULL(t.tag, '') as tag
from
wp_posts p left outer join (
select
p.id
, GROUP_CONCAT(t.name order by t.name) as tag
from
wp_terms t
left outer join wp_term_taxonomy x on (
t.term_id = x.term_id
)
left outer join wp_term_relationships r on (
x.term_taxonomy_id = r.term_taxonomy_id
)
left outer join wp_posts p on (
r.object_id = p.id
)
where
x.taxonomy = 'post_tag'
group by
p.id, p.post_title
) t on (
p.id = t.id
)
where
p.post_status = 'publish'
and p.post_type in ('post', 'page')
order by
p.post_date
抽出結果
まとめ
GROUP CONCAT関数の便利さに驚愕しますね。
この関数が無い場合はもっと複雑なクエリを書かないといけないか、
もうそれは諦めて一旦抽出したデータを Excel 等で加工するしかありませんし。
カテゴリーについても同様に取得できますし、WordPressのテーブル構造なんかについては
色々なサイトで紹介されていますので調べてみてください。
(いつかまとめるかも)
何かの参考になれば。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません