我正在尝试创建一个评级系统,用户可以对图片/视频/音频等进行评分。我目前有两张桌子
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 :(得分: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
我怀疑你有零以下的ids
答案 1 :(得分: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
答案 2 :(得分: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
这将返回每个产品的平均值,并按结果集顶部的最高平均评分排序。