用户在该产品的书签中有一个查询,还会考虑该产品的喜欢并在表中显示所有产品:
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
?我在哪里错了请帮助我。
答案 0 :(得分:1)
似乎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视为正常值。
答案 1 :(得分:1)
在知道SELECT […] (B.PRODUCT_ID IS NOT NULL) AS PRODUCT_IS_IN_BOOKMARKS […]
字段将与LEFT JOIN
,或 NULL相同的情况下,您可以使用{{ 3}}来问这个问题。
(B.PRODUCT_ID = P.PRODUCT_ID AND B.USER_ID = B.USER_ID)
您正在处理the IS NULL
and IS NOT NULL
comparison operators和horror of NULL。 NULL使一切变得困难!
不将书签列显示为false,但是它为空吗?
简短说明:NULL不是值;它是非值占位符。询问“此值等于不具有一个值吗?”没有有意义的答案,因此SQL指示响应为NULL。
更长的解释:您的联接是NULL
,因此即使在右边没有任何内容,您也要查询行。当BOOKMARKS表中没有对应的元组时,其在结果集中的列为NULL。因此,当没有对应的BOOKMARKS记录时,您的计算字段scipy.ndi.distance_transform_edt()
将比较是否为NULL;因此将得到结果spiral()
。
答案 2 :(得分:1)
您可以使用coalesce()
将null替换为其他未知ID,这些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