【问题标题】:Select all rows where there is not a specific value in a different table选择不同表中没有特定值的所有行
【发布时间】:2011-01-07 16:44:42
【问题描述】:

这是一个wordpress安装,但我认为这个问题更像是一个一般的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"

我想选择 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;
");

【问题讨论】:

    标签: mysql sql wordpress


    【解决方案1】:

    使用您当前的查询进行以下更改:

    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;
    

    【讨论】:

    • @JMC Creative - 它仍然可以工作,因为您有一行符合条件。即使您确实有一行包含'fizzbizz',您也有另一行没有,并且该行将在您的记录集中。你想要吗?
    • @JMC Creative - 通过您的编辑,您的原始查询也可以工作,但您仍应使用编辑后的版本来说明元表中没有行的记录
    • @JNK,我不想在这里要求太多,但是你能解释一下为什么我应该使用LEFT JOIN吗?我认为这意味着“只检索 LEFT 表中的数据”。
    • @JMC Creative - LEFT JOIN 表示“无论是否满足 JOIN 条件,都从 LEFT(第一个)表中获取所有内容”。如果您在右表的连接键NULL 上使用LEFT JOINWHERE 条件,则您要求的是左表中没有右表中相应记录的所有行。
    • @JMC Creative - 好的,但实际上他在我回答后几分钟就回答了:)
    【解决方案2】:
    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;
    

    应该做的伎俩;-)

    【讨论】:

      猜你喜欢
      • 2014-09-15
      • 1970-01-01
      • 2017-12-02
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多