2013-06-11 17 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

相關問題