2011-01-07 3 views
2

これはワードプレスインストールですが、一般的なSQLの質問の方が問題だと思います。まず、私のSQLスキルはあまり良くありません(私はdbを説明するための正しい形式に従っているかどうかわかりません)。別のテーブルに特定の値がないすべての行を選択してください

私が持っている二つのテーブル:

wp_posts : 

    ID (pk) | post_name | ... 
---------------------------- 
    45  | "Hello" 
    91  | "Funny" 
    16  | "Wheat" 

wp_postmeta : 

    post_id (fk) | meta_key  | meta_value | ... 
------------------------------------------------ 
    45   | "_edit_lock" | 5789789834 
    45   | "fizzbizz" | "foobar" 
    91   | "_something" | "teve" 

meta_key =「fizzbizz」

私はもともとこのクエリを持っていたwp_postmeta内に対応する行が存在しないところ私はwp_postsのすべての行を選択したいと思います誰かが、上記の場合にID = '16'を取得しないと指摘しました。どのようにしてクエリを正しく書くことができますか?

$pageposts = $wpdb->get_results(" 
    SELECT * FROM wp_posts p 
    JOIN wp_postmeta m 
    ON p.ID = m.post_id 
    WHERE m.meta_key <> 'fizzbizz' 
    ORDER BY p.post_date DESC; 
"); 

答えて

3

次のように変更して、あなたの現在のクエリを使用します。代わりにJOIN

LEFT JOINあなたWHERE句に

OR m.metakey IS NULLを追加します。

SELECT * FROM wp_posts p 
    LEFT JOIN wp_postmeta m 
    ON p.ID = m.post_id 
    WHERE m.meta_key <> 'fizzbizz' 
     OR m.metakey IS NULL 
    ORDER BY p.post_date DESC; 
+0

@JMCクリエイティブ - 条件を満たす行があるので、それでも機能します。あなたが「fizzbizz」を持っている行を1つ持っていても、あなたはそうでない行があり、その行はあなたのレコードセットに含まれます。あなたはそれが欲しいですか? – JNK

+0

@ JMCクリエイティブ - オリジナルのクエリを編集しても機能しますが、編集したバージョンを使用してメタテーブルの行を持たないレコードを使用する必要があります – JNK

+0

@JNK、ここではあまり尋ねたくありませんが、私はLEFT JOINを使うべきですか?私は、 "LEFTテーブルのデータのみを取得する"ことを意味すると思った。 – JakeParis

3
SELECT * FROM wp_posts p 
LEFT JOIN wp_postmeta m 
ON p.ID = m.post_id 
WHERE m.meta_key <> 'fizzbizz' 
OR m.metakey IS NULL 
ORDER BY p.post_date DESC; 

このトリックを行う必要があります:-)

+0

+1です! – JNK

関連する問題