2010-11-18 98 views
1

我想創建一個評級系統,用戶可以評價圖片/視頻/音頻等我有兩個表的那一刻從數據庫(SQL)返回平均評分

Table: products 
Cols: product_id[PK] | name | category | type | link 

這是產品表幷包含有關產品的信息。如果您對產品感到困惑,請將「產品」視爲圖像/視頻/音頻,我將其命名爲這樣,只是爲了讓我更容易理解它。第二張表是評分

Table: product_ratings 
Cols: rating_id[PK] | rating | product_id | timestamp 

此表存儲有關用戶評分的信息。

我想要一個頁面,它將顯示所有「產品」的最高評分(平均值)。到目前爲止,我已經通過SA望去,發現後續的一段代碼:

SELECT 
p.product_id, p.name, 
AVG(pr.rating) AS rating_average 
FROM products p 
INNER JOIN product_ratings pr 
ON pr.product_id = p.product_id 
WHERE p.product_id = 1 

這只是返回的平均得分爲特定的product_id,我將如何去獲得所有product_ids和他們的平均得分,以及如何通過PHP找到最高的一個?

我已經試過:

WHERE p.product_id < 1 AND p.product_id < 30 

但這只是返回的2 PRODUCT_ID,與它的名稱和AVERAGE_RATING,我不明白。

指導/連結料,歡迎

+0

你爲什麼給「where p.product_id = 1」? – 2010-11-18 17:03:13

+0

這只是爲了證明給定的SQL返回指定產品ID的平均評級 – Daniel 2010-11-18 17:20:02

回答

4
SELECT 
    p.product_id, 
    p.name, 
    AVG(pr.rating) AS rating_average 
FROM products p 
INNER JOIN product_ratings pr 
ON pr.product_id = p.product_id 
GROUP BY p.product_id 
ORDER BY rating_average DESC 
LIMIT 1 
+0

我打字太慢我就是這麼想的。 – Nasir 2010-11-18 17:01:55

+0

謝謝馬克,這似乎是做我最初想要的。現在將查看如何選擇列表中的第一個項目(即最高評級的產品)。 – Daniel 2010-11-18 17:18:14

+0

你可以使用Mark的查詢作爲'from'子句的子查詢,這樣,你就可以在評分結果中得到'MAX(rating_aberage)'。 – 2010-11-18 17:25:55

4

試試看:

SELECT 
p.product_id, p.name, 
AVG(pr.rating) AS rating_average 
FROM products p 
INNER JOIN product_ratings pr 
ON pr.product_id = p.product_id 

也這是毫無意義的表達:

WHERE p.product_id < 1 AND p.product_id < 30 

因爲它是完全等同於

WHERE p.product_id < 1 

,我懷疑你有零以下的ID

+0

我的意思是超過1但小於30,我感到困惑我認爲 – Daniel 2010-11-18 17:17:31

+0

哪個數據庫不需要組? – 2010-11-18 17:45:40

+0

@Stephanie Page mysql – Andrey 2010-11-18 18:21:17

0

你的查詢是接近的。只需刪除過濾所有內容的WHERE子句。

SELECT  p.product_id, p.name, 
      AVG(pr.rating) AS rating_average 
FROM products p 
INNER JOIN product_ratings pr 
ON pr.product_id = p.product_id 
ORDER BY rating_average DESC 

這將返回每個產品的平均值,並以結果集頂部的最高平均評分排序。

+0

由於某種原因,這隻顯示1行,請參閱上面的Mark Byers,他似乎列出了之前評估過的所有product_id – Daniel 2010-11-18 17:16:18