使用 table join 执行查询时出错不显示

Error executing query with table join does not display

用户在收藏该商品时有查询,也考虑该商品喜欢并显示table中的所有商品:

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?我哪里错了请帮帮我

似乎B.PRODUCT_IDP.PRODUCT_IDB.USER_IDB.USER_ID中有SQL NULL值,所以结果为NULL。

“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 视为正常值。

已知 B.PRODUCT_ID 字段将 P.PRODUCT_ID 相同的值] NULL,您可以使用 the IS NULL and IS NOT NULL comparison operators 来问那个问题。

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

您正在处理 horror of NULL and three-value logic。 NULL 让一切变得困难!

does not display a bookmark column false, but does it null?

简短说明:NULL 不是一个值;它是非值占位符。问“这个值等于没有值吗?”没有有意义的答案,因此 SQL 指示响应为 NULL。

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

您可以使用 coalesce() 将 null 替换为您的 ID 中可能永远不存在的其他未知 ID return 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