0

まず、MYSQL JOINに関しては、スキルが限られていることを述べておきます。しかし、これは私が持っているものであり、私が達成したいものです:

私はデフォルトのWordPressテーブルを持っており、特定のメタキーからpost_name、title、status、meta_valueで結果を取得したいと思っています。

これは私が持っているものです:

SELECT
    wp_posts.ID, wp_posts.post_name, wp_posts.post_title, wp_posts.post_status, wp_postmeta.meta_value
FROM wp_posts
INNER JOIN
    wp_term_relationships ON ( wp_posts.ID = wp_term_relationships.object_id ) 
INNER JOIN
    wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) 
WHERE (
        wp_term_relationships.term_taxonomy_id
        IN ( 1, 2, 3 )
    )
    AND wp_posts.post_type =  'my_post_type'
    AND (
        wp_posts.post_status
    IN (
        'my_status_1',  'my_status_2'
    )
)
AND wp_postmeta.meta_key =  'my_meta_key'
GROUP BY wp_posts.ID
ORDER BY wp_posts.ID ASC

各投稿に「my_meta_key」のpostmetaがある場合、すべてが期待どおりに機能します。ただし、「my_meta_key」が欠落している場合、投稿は結果に含まれません。

2番目のINNERJOINが原因だと思いますが、前述のように、何に置き換える必要があるのか​​わかりません。

簡単なことだと思います

4

3 に答える 3

1

に移動AND wp_postmeta.meta_key = 'my_meta_key' します

INNER JOIN
    wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) 

このようにして、左の内側を変更します

    LEFT JOIN
        wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id 
        AND wp_postmeta.meta_key =  'my_meta_key') 

条件を「WhereClause」に入れると、左結合は「上書き」されます。そしてアドバイスを追加します。コードを読みやすくするために括弧が本当に必要ない場合は、括弧を使用しないでください。

于 2013-02-27T16:10:52.727 に答える
0

テーブルのを:に変更しINNER JOINます。wp_postmetaLEFT JOIN

LEFT JOIN wp_postmeta 
    ON ( wp_posts.ID = wp_postmeta.post_id ) 

そして、のWHEREフィルターをwp_postmeta条件に移動しJOINます。

したがって、クエリは次のようになります。

SELECT wp_posts.ID, wp_posts.post_name, wp_posts.post_title, wp_posts.post_status, wp_postmeta.meta_value
FROM wp_posts 
INNER JOIN wp_term_relationships 
    ON ( wp_posts.ID = wp_term_relationships.object_id ) 
LEFT JOIN wp_postmeta 
    ON ( wp_posts.ID = wp_postmeta.post_id ) 
    AND wp_postmeta.meta_key =  'my_meta_key'
WHERE wp_term_relationships.term_taxonomy_id IN ( 1, 2, 3 )
    AND wp_posts.post_type =  'my_post_type'
    AND wp_posts.post_status IN ('my_status_1',  'my_status_2')
GROUP BY wp_posts.ID
ORDER BY wp_posts.ID ASC

構文は、INNER JOIN両方のテーブルで一致する行のみを返します。したがって、一致する行がない場合、結果は得られません。これをに変更するとLEFT JOIN、テーブルに一致する行がない場合でも、すべての行が返されwp_postmetaます。行が存在しない場合、wp_postmetaテーブルの値はになりますnull

于 2013-02-27T16:08:54.737 に答える
0

次のリターン

  • WP_Postsからのすべてのレコード
  • WP_TERM_RELATIONSHIPSを持つレコードのみ
  • wp_postsのレコードと一致するwp_postmetaのレコードのみ。

*

SELECT wp_posts.ID, wp_posts.post_name, wp_posts.post_title, 
  wp_posts.post_status, wp_postmeta.meta_value
FROM wp_posts
LEFT JOIN wp_term_relationships 
  ON wp_posts.ID = wp_term_relationships.object_id
LEFT JOIN wp_postmeta 
  ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_term_relationships.term_taxonomy_id IN ( 1, 2, 3 )
  AND wp_posts.post_type =  'my_post_type'
  AND wp_posts.post_statusIN ('my_status_1',  'my_status_2') 
  AND (wp_postmeta.meta_key =  'my_meta_key' or wp_postmeta.meta_key is null)
GROUP BY wp_posts.ID
ORDER BY wp_posts.ID ASC

nullが必要です。そうでない場合、wp_postmetaデータのないwp_postsのレコードは除外されます。

于 2013-02-27T16:14:38.250 に答える