Выберите все строки, в которых нет конкретного значения в другой таблице - PullRequest
2 голосов
/ 07 января 2011

Это установка WordPress, но я думаю, что вопрос больше общего вопроса SQL.Во-первых, мои навыки sql невелики (я даже не знаю, придерживаюсь ли я правильного формата для иллюстрации БД).

У меня есть две таблицы:

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"

Я хотел бы выбрать все строки в wp_posts, где нет соответствующей строки в wp_postmeta, где meta_key = "fizzbizz"

У меня изначально был этот запрос, но кто-то указал, что он не получит 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;
");

Ответы [ 2 ]

3 голосов
/ 07 января 2011
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;

Должен сделать трюк; -)

3 голосов
/ 07 января 2011

Используйте ваш текущий запрос со следующими изменениями:

LEFT JOIN вместо JOIN

добавьте

OR m.metakey IS NULL к вашему предложению WHERE:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...