2013-06-11 18 views
0

我有两个表,其中一个products和另一个ratings列出所有的行,并添加一个额外的字段,如果行在其他表中退出

我想列出所有products,如果用户对产品进行了评级(然后r.by是userId,r.rating是评级),那么我想添加一个userrating = r.rating else userrating = 0 to 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

'r.by = :如果特定用户ID匹配,则USER_ID'正在分配一个值。 – PinnyM

+0

“它只适用于一个用户,所以我不知道它有什么问题。”嗯,也许这没什么不妥,你也没有问题。顺便提一下,问题是什么? –

+0

如果该产品没有任何关联评分,则r.rating和r.by将为NULL。这还不够吗?你可以有'CASE当r.by IS NULL那么r.rating ELSE 0 END',或者更紧凑的'COALESCE(r.rating,0)',或者更紧凑的(也许更正确的)'r .rating“,这将给予评价为'NULL'(未评级)而非零(推测非常非常差)。 –

回答

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 
... 

注意,如果多个用户同时给予不同等级一个产品,你会得到多行返回 - 每个不同的评级值。

UPDATE

要获得一个用户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 
+0

如果用户对产品进行了评分,那么该评分应该是他/她评价的任何评分。该解决方案似乎给出了最新(或第一个?)评级 - 而不是当前用户的评级。 –

+0

@KennethB:原来的答案是为_all_用户 - 更新,以解释这将如何为特定用户。 – PinnyM

相关问题