wordpressのタグを取得するSQL wordpressのためのsql

前回のおさらい

今回はデータベースのテーブルを内部結合してタグを取得する話をしていきます。

前回は投稿記事をselect文で数を制限してデータとってくる話 wordpressのためのsql

復習になりますが、LIMITを使った文になります。

$sql = "SELECT post_title
        FROM wp_posts 
        WHERE post_status = 'publish'
        AND post_type =  'page'  
        ORDER BY id desc
        LIMIT 5 , 1";

条件は公開済みの記事と固定ページの2つです。
並び順はidの降順です。
LIMIT 開始位置 , 取得件数ですね。

タグを取得する方法

$sql= 'SELECT wp_terms.term_id, wp_terms.name,wp_term_taxonomy.count
      FROM wp_terms INNER JOIN wp_term_taxonomy
      ON wp_terms.term_id = wp_term_taxonomy.term_id
      WHERE wp_term_taxonomy.taxonomy = "post_tag"
      ORDER BY wp_terms.term_id desc
      limit 0 , 5'; 

簡単に訳すと「wp_termsテーブルとwp_trem_taxonomyテーブルをterm_idを結合条件として内部結合し、
タグをterm_idの降順でterm_id(id),name(タグの名前),count(記事で使用している数)のカラム(列)を0番目のレコード(行)から5件選びます」です。
テーブルの情報は下記リンクを参照のこと

wp_termsテーブルの構造

wp_term_taxonomyテーブルの構造

タグを取得する上でテーブルを結合する訳

何故?テーブルを結合しなくては、いけないかと言いますとwp_termsテーブルだけだと「タグとカテゴリー(リンクカテゴリー含む)」を取得してしまいます。
タグのみ又はカテゴリーのみを取得したい場合はwp_term_taxonomyテーブルのカラムのtaxonomyに登録してある”タグ”か”カテゴリー”かの情報を得る必要があります。sqlでその条件を記載しているのが下記の部分です。

WHERE wp_term_taxonomy.taxonomy = "post_tag" //tagのみ
又は、
WHERE wp_term_taxonomy.taxonomy = "category" //カテゴリーのみ

結合条件の解説

結合条件なのですが、

INNER JOIN wp_term_taxonomy
ON wp_terms.term_id = wp_term_taxonomy.term_id

両方のテーブルにterm_idがありますね、大体のデータベースのテーブルは結合したいテーブルのid又はユニーク(唯一)な値が登録されているカラム名が入っています。
wp_termsのterm_idとwp_term_taxonomyのterm_idは同じ値(関連付けたれた情報に関しては同じ値)が入っています。
何故?テーブルを分けるのかと言いますと、簡単にいえばテーブルの中の重複を減らしデータ量を減らすためですね。
例えば、レビューを同じ人が2件書いたとします。名前とアドレスとレビュー内容です。
1つのテーブルにいれた場合

テーブル名:review
id      name   address       review_content
1       Aさん  aaa@ドメイン   面白かった
2       Bさん  bbb@ドメイン   面白くない
3       Aさん  aaa@ドメイン   つまらなかった

1つのテーブルに何も考えずに入れてしまうとnameとaddressに同じ値が重複していますね。
テーブルを2つに分けるとどうでしょうか?

テーブル名:user
id      name   address
1       Aさん  aaa@ドメイン
2       Bさん  bbb@ドメイン

テーブル名:review
id  review_content  user_id
1   面白かった        1
2   面白くない        2
3   つまらなかった。   1

user_idはuserテーブルのidのカラム(列)の値です。どうでしょうか?重複が数字のみになりデータ量がだいぶ軽くなったと思いませんか?数行なのであまり変わりませんが、数千行になってくるとかなり違ってきます。
この時の結合条件は

FROM user INNER JOIN review
ON user.id = review.user_id

になります。
今回は以上です。
疑問、質問等はコメントください。
間違ってる場合も訂正の意を込めてコメントお願いします。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする