【WP】phpMyAdminでカテゴリー名を取得してCSVで書き出す「INNER JOIN~ON」

【WP】phpMyAdminでカテゴリー名を取得してCSVで書き出す「INNER JOIN~ON」

thumbnail SQL(phpMyAdmin) wp-note

phpMyAdminでカテゴリー名(slug)を取得してCSVで書き出そうと思い、カテゴリー名(slug)が保存されているテーブル「wp_terms」を開くと重複するスラッグ名があったり、設定しているカテゴリー数(36個)よりもはるかに多い行があったりするんですよね。

【WP】phpMyAdminでカテゴリー名を取得してCSVで書き出す「INNER JOIN~ON」

それで調べてみたらwp_termsにはタグ名(slug)も一緒に保存されているというのでそれらを除外してやる必要がありました。

ただ、それを行うにはSQL構文「INNER JOIN ~ ON ~」を使わないと無理みたいなのでちょっと勉強しました。

 

 

INNER JOIN ~ ON (内部結合)

「INNER JOIN」とは複数のテーブルを結合し、条件が一致したもののみを取得して表示するSQL構文(命令文)です。尚、ここでは触れませんが「外部結合」というものもあります。

PHP
SELECT -- 列を指定 複数の場合はカンマ(,)で区切る
  テーブルA.列名,
  テーブルB.列名
FROM   -- どこのテーブル
  テーブルA
INNER JOIN
  テーブルB
ON 
  テーブルA.列名 = テーブルB.列名 -- 結合条件

下記がカテゴリー固有のID(term_id)、カテゴリー名(name)、スラッグ(slug)を取得する命令文です。

SQL
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クエリのテキストボックスに書き込んで実行するとタグの情報を除いたデータが取り出せます。

【WP】phpMyAdminでカテゴリー名を取得してCSVで書き出す「INNER JOIN~ON」

Showing rows(行)の値がワードプレスの投稿に設定しているカテゴリー数と合致しているので正確に取り出せたようです。

【WP】phpMyAdminでカテゴリー名を取得してCSVで書き出す「INNER JOIN~ON」

因みに’category’を’post_tag’に変更するとタグのみを取得することもできます。

SQL
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エクスポート

検索結果が表示された下の方に「クエリ結果操作」→「エクスポート」という項目があるのでそちらを選択。

【WP】phpMyAdminでカテゴリー名を取得してCSVで書き出す「INNER JOIN~ON」

エクスポート方法で「詳細」を選択。

【WP】phpMyAdminでカテゴリー名を取得してCSVで書き出す「INNER JOIN~ON」

フォーマットを「CSV」、「1行目にカラム名を追加する」にチェックを入れて実行ボタンを押すとエクスポートされます。

【WP】phpMyAdminでカテゴリー名を取得してCSVで書き出す「INNER JOIN~ON」

エクセル系の表計算ソフトで開くとちゃんとデータを出力できていました。

【WP】phpMyAdminでカテゴリー名を取得してCSVで書き出す「INNER JOIN~ON」

 

 

AS (名前の変更)

ASとは構文で使用する wp_terms や term_id などのカラム名やテーブル名などを別名に変更することができます。ただ、変更するといっても検索結果に表示される名前が書き換えられるだけでデータベースが書き換えられる訳ではないようです。

例えば、先ほどのコードだと下記のように書き換えることができます。

SQL
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のところを元のままにしているとエラーになります。

SQL
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'

【WP】phpMyAdminでカテゴリー名を取得してCSVで書き出す「INNER JOIN~ON」

命令文って何となく上から処理されてくように見えますが、SQLの実行順序は以下のような順番で処理されるそうなのでSELECTより前に書いたASによって書き換えられているので wp_terms.name が unknown colum となっているでしょうねぇ。

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. SELECT
  8. DISTINCT
  9. ORDER BY
  10. LIMIT