列出所有行,如果另一个表中存在行,则添加其他字段

时间:2013-06-11 13:36:06

标签: mysql sql

我有两张桌子,一张是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”=(用户评分)。

1 个答案:

答案 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