使用 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_ID
、P.PRODUCT_ID
、B.USER_ID
和B.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
用户在收藏该商品时有查询,也考虑该商品喜欢并显示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_ID
、P.PRODUCT_ID
、B.USER_ID
和B.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