我的mysql数据库中有两个表:
- 行程(id、名称、desc、创建时间)
- trip_ ratings(id、评级值、tripid、用户 ID)
我想要获取按较高平均评分排序的 100 条最近旅行。
我尝试过以下 mysql 查询:
SELECT AVG(ratingvalue),tripid,tripcreatedat FROM trip_ratings
INNER JOIN trips on trip_ratings.tripid = trips.id
GROUP BY trip_ratings.tripid
ORDER BY AVG(ratingvalue) DESC, tripcreatedat DESC
LIMIT 100
但由于它首先按评分值排序,所以我只能得到按较高评分排序的旅行。
是否可以在单个查询中实现?谁能提示我该怎么办?
编辑:示例: 我在 trip_ ratings 表中有这样的数据:
从我尝试过的查询中我可以得到这样的结果。
但我的问题是:获取按较高平均评分排序的 100 个最近旅行。
除了投反对票和接近投票之外,任何人都可以有任何解决方案,或者任何人都可以给我一个提示,在单个查询中是否可能?谢谢。
最佳答案
一种选择是使用内联 View ,首先获取“100 个最近的行程”。
然后将其加入 trip_ ratings
,以计算“平均评分”并按该结果排序。
SELECT m.id AS tripid
, AVG(r.ratingvalue) AS average_rating
, m.tripcreatedat
FROM ( SELECT t.id
, t.tripcreatedat
FROM trips t
ORDER BY t.tripcreatedat DESC
LIMIT 100
) m
LEFT
JOIN trip_ratings r
ON r.tripid = m.id
GROUP BY m.id, m.tripcreatedat
ORDER BY AVG(r.ratingvalue) DESC
如果有多个行程具有相同的平均评分,则这些行程的返回顺序是不确定的。您可以在顺序中添加其他表达式以使其更具确定性。
ORDER BY AVG(r.ratingvalue) DESC, m.tripcreatedat DESC, m.id DESC
<小时/>
这不是唯一的方法。还有其他方法可以达到相同的结果。
关于php - ORDER BY 具有两列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29352997/