我有两张桌子,一张是products
,另一张是ratings
。
我想列出所有products
,如果用户对产品进行了评级(然后r.by是userId,r.rating是评级),那么我想添加userrating
= r .rating else userrating = 0到SQL响应。
它只适用于一个用户,所以我不知道它有什么问题。
$sql = "SELECT DISTINCT p.id, p.rating, CASE WHEN r.by=:USER_ID
THEN r.rating ELSE 0 END AS userrating FROM `products` p
LEFT OUTER JOIN `ratings` r
ON r.productid=p.id
WHERE p.moderated=1
order by p.rating desc";
修改
我需要列出所有产品,如果用户对产品进行了评分,我需要附加用户评级为“userrating”=(用户评分)。
答案 0 :(得分:0)
变化:
SELECT DISTINCT p.id, p.rating, CASE WHEN r.by=:USER_ID
要:
SELECT DISTINCT p.id, p.rating, CASE WHEN r.by IS NOT NULL
更简单的是,您可以用COALESCE替换CASE语句:
SELECT DISTINCT p.id, p.rating, COALESCE(r.rating, 0) AS userrating
FROM `products` p
...
请注意,如果多个用户对单个产品给出了不同的评分,则会返回多行 - 每个不同的评级值对应一行。
<强>更新强>
要获得单个用户ID的评级(作为USER_ID
传递),最简单的方法是过滤外连接本身:
SELECT DISTINCT p.id, p.rating, COALESCE(r.rating, 0) AS userrating
FROM `products` p
LEFT OUTER JOIN `ratings` r
ON r.productid=p.id AND r.by=:USER_ID
WHERE p.moderated=1
ORDER BY p.rating desc