0

用户在该产品的书签中有一个查询,也考虑了该产品的点赞,并在表中显示所有产品:

SELECT P.*, 
  COUNT(L.USER_ID) AS LIKES, 
  (B.PRODUCT_ID = P.PRODUCT_ID AND B.USER_ID = B.USER_ID) AS BOOKMARKS 
    FROM PRODUCTS AS P 
      LEFT JOIN LIKES_PRODUCTS AS L ON (L.PRODUCT_ID = P.PRODUCT_ID) 
      LEFT JOIN BOOKMARKS_PRODUCTS AS B ON (B.PRODUCT_ID = P.PRODUCT_ID)
        GROUP BY P.PRODUCT_ID, B.PRODUCT_ID, B.USER_ID ORDER BY P.PRODUCT_ID

但是他将产品添加到产品中的现有产品中,并且不显示false,而仅显示 ,并对其位置进行true错误显示:null

product_id |  product_name | ... | LIKES | BOOKMARKS |
------------------------------------------------------
     1     |     name 1    | ... |   0   |   true    |
     1     |     name 1    | ... |   0   |   true    |
     2     |     name 2    | ... |   0   |   NULL    |
     3     |     name 3    | ... |   0   |   NULL    |
     4     |     name 4    | ... |   0   |   NULL    |

为什么他给我加了一个额外的产品 1 并且不显示书签栏false,但它有null吗?我哪里错了请帮帮我。

4

3 回答 3

1

似乎有些B.PRODUCT_IDP.PRODUCT_ID和具有 SQL NULL 值,因此结果为 NULL B.USER_IDB.USER_ID

“NULL”在 SQL 中表示“未知”。

如果你检查两件事是否相等,其中之一是未知的,结果是未知的。

如果两个条件必须为真,但一个条件的结果未知,则总的结果是未知的。

简而言之,NULL 具有“传染性”。

也许这就是你想要的:

    B.PRODUCT_ID IS NOT DISTINCT FROM P.PRODUCT_ID
AND B.USER_ID    IS NOT DISTINCT FROM B.USER_ID

IS NOT DISTINCT FROM就像=,但它将 NULL 视为正常值。

于 2019-02-20T05:59:29.393 回答
1

知道该B.PRODUCT_ID字段的值与NULL相同,您可以使用P.PRODUCT_ID比较运算符询问该问题。IS NULLIS NOT NULL

SELECT […] (B.PRODUCT_ID IS NOT NULL) AS PRODUCT_IS_IN_BOOKMARKS […]

您正在处理NULL和三值逻辑的恐怖。NULL 让一切变得困难!

不显示书签列 false,但它是否为空?

简短说明:NULL 不是一个值;它是非值占位符。问“这个值是否等于 don't-have-a-value?” 没有有意义的答案,因此 SQL 规定响应为 NULL。

更长的解释:您的联接是,因此即使该联接的右侧没有任何内容LEFT JOIN,您也会要求行。当 BOOKMARKS 表中没有对应的元组时,其在结果集中的列为 NULL。因此,当没有相应的 BOOKMARKS 记录时,您的计算字段将与 NULL 比较是否相等;这样就会得到结果。(B.PRODUCT_ID = P.PRODUCT_ID AND B.USER_ID = B.USER_ID)NULL

于 2019-02-20T06:06:12.480 回答
1

您可以使用coalesce()null 替换为您的 id 中可能永远不存在的其他未知 id 返回 false 因为 null=null 检查是不可能的

SELECT P.*, 
  COUNT(L.USER_ID) AS LIKES, 
  (coalesce(B.PRODUCT_ID,-99999) = P.PRODUCT_ID AND ) AS BOOKMARKS 
    FROM PRODUCTS AS P 
      LEFT JOIN LIKES_PRODUCTS AS L ON (L.PRODUCT_ID = P.PRODUCT_ID) 
      LEFT JOIN BOOKMARKS_PRODUCTS AS B ON (B.PRODUCT_ID = P.PRODUCT_ID)
        GROUP BY P.PRODUCT_ID, B.PRODUCT_ID, B.USER_ID ORDER BY P.PRODUCT_ID
于 2019-02-20T06:08:09.027 回答