前回のおさらい
今回はデータベースのテーブルを内部結合してタグを取得する話をしていきます。
前回は投稿記事を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テーブルのカラムの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
になります。
今回は以上です。
疑問、質問等はコメントください。
間違ってる場合も訂正の意を込めてコメントお願いします。
2年くらい前に私は下記の本で勉強しました。(初版)
|
|