【问题标题】:MySQL left join with NULL valuesMySQL left join 与 NULL 值
【发布时间】:2016-07-05 07:07:39
【问题描述】:

我确定这个问题已经被问及回答了,但不知道这个问题应该是怎样的。

我有两张桌子

ID | name
=========
 1 | foo
 2 | bar
 3 | lou
 4 | sue

还有一个元表:

p_ID | key | value
===================
  1  | poo | 1
  2  | zoo | 'whatever'
  3  | clu | 423
  4  | poo | 1

我喜欢从第一个没有分配poo 值的表中获取所有条目:

ID | name
=========
 2 | bar
 3 | lou

我的方法是

SELECT * 
  FROM table AS p 
  LEFT JOIN meta AS m 
    ON m.p_id = p.ID 
 WHERE m.key = 'poo' 
   AND m.value IS NULL

但这会返回一个空结果

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您必须将 m.key = 'poo' 表达式移到 ON 子句中。 WHERE 子句中的所有内容都必须存在,即使在 LEFT JOIN 中也是如此。

    SELECT * 
      FROM table AS p 
      LEFT 
      JOIN meta AS m 
        ON m.p_id = p.ID 
       AND m.key = 'poo'
     WHERE m.value IS NULL
    

    【讨论】:

    • 我就知道这么简单!
    【解决方案2】:

    我认为你应该想要这个;)

    SELECT *
    FROM table AS p
    LEFT JOIN meta AS m
    ON m.p_id = p.ID
    AND m.key = 'poo'
    WHERE m.value IS NULL
    

    当您在WHERE 子句中使用m.key = 'poo' 时,这将被计算为INNER JOIN,因此您只会获得带有m.key = 'poo' 的记录,而不是表中的所有行。

    【讨论】:

      【解决方案3】:

      您可以改用INNER JOIN

      SELECT *
          FROM `table` T
          INNER JOIN meta M ON M.p_id = T.ID
          WHERE M.key <> 'poo'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        • 1970-01-01
        • 2012-04-02
        • 2017-04-06
        相关资源
        最近更新 更多