【问题标题】:SQL: Get null as a return value for rows that don't match querySQL:获取 null 作为与查询不匹配的行的返回值
【发布时间】:2015-07-03 11:55:04
【问题描述】:

我有一张桌子Entity 和一张桌子Friends。我想获取访问过同一地点的人的姓名,但我只想在他们不是该人的朋友时返回他们(建议的朋友查询)。为此,我编写了以下查询:

SELECT Entity_Id,
       Category AS FC
 FROM  entity
 LEFT 
 JOIN  friends 
   ON  entity.Entity_Id = friends.Entity_Id1 
   OR  entity.Entity_Id = friends.Entity_Id2
WHERE  Entity_Id IN ( :list_of_ids ) 
  AND  Entity_Id != :user_id
  AND  Category != 4
GROUP 
   BY  Entity_Id

:list_of_ids 是一个逗号分隔的用户 ID 列表,在我的测试查询中有 82 个用户,但是从查询中只返回 15 个用户,其中返回的用户是与 :user_id 有关系的用户。

查询中不会返回在表中没有关系的任何用户。我认为通过提供 LEFT OUTER JOIN 它将为在朋友表中找不到的字段返回 NULL。

----- EXPECTED -----
--------------------
Entity_Id         FC
--------------------
1                  3
2                  2
3                  2
4               null
52              null
64              null

------ ACTUAL -------
---------------------
Entity_Id          FC
---------------------
1                  3
2                  2
3                  2

myfriends 表的结构如下,如果有帮助,还要注意它支持互惠关系...

------ FRIENDS ------
---------------------
fid                PK
entity_id1        INT
entity_id2        INT
category          INT  -- 1 = Facebook, 2 = G+, 3 = App, 4 = Blocked

我如何返回丢失关系的用户?

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    你想要一个left outer join。但是,使用left join,第二张表上的条件需要进入on 子句:

    SELECT e.Entity_Id, f.Category AS FC
    FROM entity e LEFT JOIN
         friends f
         ON e.Entity_Id IN (f.Entity_Id1, f.Entity_Id2) AND
            f.category <> 4
    WHERE e.Entity_Id IN ( :list_of_ids ) AND
          e.Entity_Id <> :user_id
    GROUP BY e.Entity_Id;
    

    当您在WHERE 子句中具有category 的条件时,您将LEFT JOIN 转换为INNER JOIN。当没有匹配时,category 的值为NULL,比较失败。

    【讨论】:

    • doh 我是如此接近,我想我需要打破 SQL 书,我在完成我的论文后没有练习 SQL。谢谢戈登!
    【解决方案2】:

    Category 属于哪个表?如果是好友列,请将 Category != 4WHERE 移动到 ON 以获得真正的外连接。 (否则它将作为常规的内部连接执行...):

    SELECT Entity_Id, Category AS FC
    FROM  entity
     LEFT JOIN  friends 
       ON  (entity.Entity_Id = friends.Entity_Id1 
            OR entity.Entity_Id = friends.Entity_Id2)
       AND Category != 4
    WHERE  entity.Entity_Id IN ( :list_of_ids ) 
      AND  entity.Entity_Id != :user_id
    GROUP 
       BY  Entity_Id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多