【WP】phpMyAdminでカテゴリー名を取得してCSVで書き出す「INNER JOIN~ON」
phpMyAdminでカテゴリー名(slug)を取得してCSVで書き出そうと思い、カテゴリー名(slug)が保存されているテーブル「wp_terms」を開くと重複するスラッグ名があったり、設定しているカテゴリー数(36個)よりもはるかに多い行があったりするんですよね。
それで調べてみたらwp_termsにはタグ名(slug)も一緒に保存されているというのでそれらを除外してやる必要がありました。
ただ、それを行うにはSQL構文「INNER JOIN ~ ON ~」を使わないと無理みたいなのでちょっと勉強しました。
INNER JOIN ~ ON (内部結合)
「INNER JOIN」とは複数のテーブルを結合し、条件が一致したもののみを取得して表示するSQL構文(命令文)です。尚、ここでは触れませんが「外部結合」というものもあります。
SELECT -- 列を指定 複数の場合はカンマ(,)で区切る
テーブルA.列名,
テーブルB.列名
FROM -- どこのテーブル
テーブルA
INNER JOIN
テーブルB
ON
テーブルA.列名 = テーブルB.列名 -- 結合条件
下記がカテゴリー固有のID(term_id)、カテゴリー名(name)、スラッグ(slug)を取得する命令文です。
SELECT
wp_terms.term_id,
wp_terms.name ,
wp_terms.slug
FROM
wp_term_taxonomy
INNER JOIN
wp_terms
ON
wp_term_taxonomy.term_id = wp_terms.term_id
WHERE
wp_term_taxonomy.taxonomy = 'category'
命令文の詳細です。
1-4行目
SELECTでは、2つのテーブルを結合したものから取得するので、カラム名はどのテーブルのどのカラムなのかが分かるようにテーブル名.カラム名の形式で指定します。
5-6行目
FROMでどの表(テーブル)を検索するか指定します。
7-8行目
INNER JOINで結合するテーブルを指定します。
9-10行目
ONで結合条件を設定します。
wp_term_taxonomy
と wp_terms
にはterm_id
という同じidデータが入っているのでこの条件に合致するデータを結合するという意味です。逆に言うと同じ列(カラム)がない場合は結合することはできないということみたいです。
11-12行目
WHEREは結合したデータに対して条件をつけて抽出します。つまり条件に応じたものだけ表示する「フィルタ」みたいなイメージです。
wp_term_taxonomy.taxonomy には’category’、’post_tag’、’nav_menu’というデータが入っていたので WHERE で’category’を指定します。
上記コードをSQLクエリのテキストボックスに書き込んで実行するとタグの情報を除いたデータが取り出せます。
Showing rows(行)の値がワードプレスの投稿に設定しているカテゴリー数と合致しているので正確に取り出せたようです。
因みに’category’を’post_tag’に変更するとタグのみを取得することもできます。
SELECT
wp_terms.term_id,
wp_terms.name ,
wp_terms.slug
FROM
wp_term_taxonomy
INNER JOIN
wp_terms
ON
wp_term_taxonomy.term_id = wp_terms.term_id
WHERE
wp_term_taxonomy.taxonomy = 'post_tag'
‘post_tag’や’category’はテーブルに保存されているデータなので引用符のシングルクォーテーション(‘)か、ダブルクォーテーション(“)で囲む必要があり、wp_terms や wp_term_taxonomy などはテーブルの行や列の項目なのでその必要がありません。
CSVエクスポート
検索結果が表示された下の方に「クエリ結果操作」→「エクスポート」という項目があるのでそちらを選択。
エクスポート方法で「詳細」を選択。
フォーマットを「CSV」、「1行目にカラム名を追加する」にチェックを入れて実行ボタンを押すとエクスポートされます。
エクセル系の表計算ソフトで開くとちゃんとデータを出力できていました。
AS (名前の変更)
ASとは構文で使用する wp_terms や term_id などのカラム名やテーブル名などを別名に変更することができます。ただ、変更するといっても検索結果に表示される名前が書き換えられるだけでデータベースが書き換えられる訳ではないようです。
例えば、先ほどのコードだと下記のように書き換えることができます。
SELECT
wt.term_id,
wt.name,
wt.slug
FROM
wp_term_taxonomy AS wtt
INNER JOIN
wp_terms AS wt
ON
wtt.term_id = wt.term_id
WHERE
wtt.taxonomy = 'category'
因みにINNER JOINのところで別名に変更しているのにSELECTのところを元のままにしているとエラーになります。
SELECT
wt.term_id ,
wp_terms.name ,
wt.slug
FROM
wp_term_taxonomy AS wtt
INNER JOIN
wp_terms AS wt
ON
wtt.term_id = wt.term_id
WHERE
wtt.taxonomy = 'category'
命令文って何となく上から処理されてくように見えますが、SQLの実行順序は以下のような順番で処理されるそうなのでSELECTより前に書いたASによって書き換えられているので wp_terms.name が unknown colum となっているでしょうねぇ。
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- LIMIT