SQL文で直接データベースにアクセスを行う

WordPressからデータの取り出しを行うとき、get_postとかget_post_metaの関数を何回か利用して行うときがあると思います。この時、多数のデータベース検索をしてしまい、データベースに負荷をかけてしまう恐れがあります。そのようなときには、自分でデータベース検索を行う関数をSQLで作ってしまい、検索数を減らすことが可能です。

$room_ids = get_posts(array(
'post_type' => 'rooms',
'post_status' => array('publish'),
'posts_per_page' => -1,
'fields' => 'ids'
));

foreach($room_ids as $room_id) {
$room_number = get_post_meta($room_id, "room_number", true);
$select_building = get_post_meta($room_id, 'select_building', true);
$building_name = get_post_meta($select_building, 'building_name', true);
}

以上のコードでは、公開された部屋の投稿のidだけをget_postして、その後にそれぞれの部屋のroom_numberとbuilding_nameを取得しています。これを、SQL文で実装すると以下の様になります。

//返り値の設定
SELECT  m1.meta_value AS room_number, m3.meta_value AS building_name 
//データベースの結合
FROM `wp1_posts` 
LEFT JOIN wp1_postmeta AS m1 ON (wp1_posts.ID = m1.post_id AND m1.meta_key = 'room_number') 
LEFT JOIN wp1_postmeta AS m2 ON (wp1_posts.ID = m2.post_id AND m2.meta_key = 'select_building') 
LEFT JOIN wp1_postmeta AS m3 ON (m2.meta_value = m3.post_id AND m3.meta_key = 'building_name') 
//データベースの取得する投稿の選択
WHERE post_type = 'rooms' AND post_status = 'publish'

簡単に上記のコードを解説しましたが、詳しくは以下のサイトがSQLでの検索の仕方を分かりやすく解説していたので参考にしてください データベース講座