19985


コードの通り、テーブル名`wp_posts`のカラム名`post_id`に一致するテーブル名`wp_postmeta`のカラム名`post_id`を一回のSQL文で取得したいです。下記の場合では取得できませんでした。

[code]

    $str1 = 'post';
    $str2 = 'publish';
    $result = $wpdb->get_results($wpdb->prepare("
    
    SELECT * FROM wp_posts,wp_postmeta
    WHERE wp_posts.post_type = %s 
    AND wp_posts.post_status = %s
    AND wp_postmeta.post_id = wp_posts.post_id
    ORDER BY post_date DESC 
    LIMIT 25
    ", $str1, $str2));
    
[/code]

データベース中身はこうなっています。  
wp_posts  
post_id 1001 PRIMARY  
post_title LION

post_id 1002 PRIMARY  
post_title TIGER

wp_postmeta  
meta_id 8501 PRIMARY  
post_id 1001  
key LEO  
val RAION

meta_id 8502 PRIMARY  
post_id 1001  
key NEKO  
val TANAKA


CC BY-SA 3.0
2015-12-14T21:22:02.400
19983
2015-12-15T14:39:41.557
2015-12-14T22:24:10.423
4236
7973
question
php mysql sql wordpress
MySQL PDOで複数テーブル（tableA,tableB) where (tableB.metaID=tableA.id)


まず純粋にSQL文レベルで話として

> wp_postmeta.post_id = wp_posts.post_id

と結合できるのであれば、`post_id`を得るために`wp_postmeta`テーブルを見る必要はなく`wp_posts`テーブルを見れば済むことでしょう。

次にWordPressについて、公式ドキュメントの[データベース概要 - テーブル：
wp_posts](http://wpdocs.osdn.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A6%82%E8%A6%81#.E3.83.86.E3.83.BC.E3.83.96.E3.83.AB.EF.BC.9A_wp_posts)を見ますと投稿IDのフィールドは`post_id`ではなく`ID`とのことですが、カラム名は本当に正しいですか？

また、インストール時にテーブル名の接頭辞は変更できるため、`$wpdb`を使って

[code]

    $result = $wpdb->get_results($wpdb->prepare("
        SELECT ID
        FROM $wpdb->posts
        WHERE post_type = %s AND post_status = %s
        ORDER BY post_date DESC 
        LIMIT 25
        ", $str1, $str2));
    
[/code]

とするそうです。


CC BY-SA 3.0
2015-12-14T22:23:12.043
19985
2015-12-14T22:23:12.043
4236
19983
answer


試してないので間違ってたらすみません。  
まず重複を排除するには `SELECT DISTINCT` を使います。

[code]

    SELECT DISTINCT wp_postmeta.post_id, wp_posts.post_date
      FROM wp_posts INNER JOIN wp_posts on wp_posts.id = wp_postmeta.post_id 
     WHERE wp_posts.post_type = 'post'
       AND wp_posts.post_status = 'publish'
    ORDER BY wp_posts.post_date DESC 
    
[/code]

もし `wp_posts` には存在するが、`wp_postmeta` には存在しない レコードを含めるには外部結合(LEFT JOIN)を使います。

[code]

    SELECT DISTINCT wp_postmeta.post_id, wp_posts.post_date
      FROM wp_posts LEFT JOIN wp_posts on wp_posts.id = wp_postmeta.post_id 
     WHERE wp_posts.post_type = 'post'
       AND wp_posts.post_status = 'publish'
    ORDER BY wp_posts.post_date DESC 
    
[/code]


CC BY-SA 3.0
2015-12-15T14:39:41.557
20037
2015-12-15T14:39:41.557
5008
19983
answer