我是数据库的新手,所以我还不知道如何正确地使用连接,子查询等。 这就是为什么我很不确定如何按照另一个表的平均值对产品进行排序。
这是我的用处:
我有一个这种风格的简单的产品表
|id|product|more fields|
|1 |hat |feathered |
|2 |pants |jeans |
|3 |pants |cargo |
在第二个表PRODUTCS_RATINATE中,我有五星评级,如
|id|product_id|rating|
|1 | 1 | 5 |
|2 | 2 | 2 |
|3 | 3 | 4 |
|4 | 1 | 4 |
|5 | 3 | 3 |
现在我想能够在网站上根据平均评级对这些进行排序(简单的算术平均数就可以了)。 这样的东西会有用吗?
SELECT * FROM products ORDER BY (SELECT AVG(rating) AS avg_rating FROM product_ratings) DESC;
或者这是我应该使用连接的地方? 如果,怎么做? 任何对初学者的帮助都将不胜感激!
你需要加入
SELECT distinct p.*
FROM products p
INNER JOIN product_ratings r ON r.product_id = p.id
ORDER BY r.rating DESC;
将products
连接到返回平均评等的查询:
SELECT p.*
FROM products p
INNER JOIN (
SELECT product_id, AVG(rating) avg_rating
FROM product_ratings
GROUP BY product_id
) r ON r.product_id = p.id
ORDER BY r.avg_rating DESC;
或者在order by
子句中使用相关子查询:
SELECT p.*
FROM products p
ORDER BY (SELECT AVG(rating) AS avg_rating FROM product_ratings WHERE product_id = p.id) DESC;
请参阅演示。
结果:
> id | product | more fields
> -: | :------ | :----------
> 1 | hat | feathered
> 3 | pants | cargo
> 2 | pants | jeans