web-dev-qa-db-ja.com

Wp_postから選択し、wp_postmetaから複数のmeta_valueを選択します。

私がSQLスキルを持っていなかったので、ここで私は自分の進路を邪魔されました。

私はpost_id、post_titleおよび2つのpostmeta値を選択しようとしています - 最初のものは 'search_country'のmeta_key、そしてもう一つは 'search_region'のmeta_keyです。

私はちょうどsearch_countryを取得するための実用的な解決策があると思います:

 $querystr = "
       SELECT $wpdb->posts.ID as id, $wpdb->posts.post_title as title, $wpdb->postmeta.meta_value as country
       FROM $wpdb->posts, $wpdb->postmeta
       WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 
       AND $wpdb->postmeta.meta_key = 'search_country' 
       AND $wpdb->posts.post_status = 'publish' 
       AND $wpdb->posts.post_type = 'films'
       AND $wpdb->postmeta.meta_value IS NOT NULL
       ORDER BY $wpdb->posts.post_title ASC
    ";

    $festivals = $wpdb->get_results($querystr, OBJECT);

しかし、私はsearch_regionも取得するためにこれを変更する方法を知りませんか?

私はSQLに慣れたことがない:)

1
Chris

post_metaテーブルを、各メタ値に対して1回ずつ、postsname__テーブルに2回結合する必要があります。

SELECT p.ID id, p.post_title title, country.meta_value country, region.meta_value region
FROM {$wpdb->posts} p
JOIN {$wpdb->postmeta} country 
    ON p.ID = country.post_id AND country.meta_key = 'search_country'
JOIN {$wpdb->postmeta} region
    ON p.ID = region.post_id AND region.meta_key = 'search_region'
WHERE 
    p.post_status = 'publish'
    AND p.post_type = 'films'
ORDER BY p.post_title ASC

テーブル(pname __、countryname __、regionname__)のエイリアスを作成して、同じテーブルを2回結合するときに読みやすくすることをお勧めします。同時に別のmeta_valueが必要な場合は、post_metaテーブルにさらに追加できます。

JOINname__を使用すると、投稿に両方のメタキーの値がある場合にのみ結果が返されます。一方をNULLname__にしたい場合は、代わりにテーブルをLEFT JOINにします。

2
doublesharp