ORDER BY 两列
ORDER BY with two columns
我在 mysql 数据库中有两个 table:
- trips(id,name,desc,createdat)
- trip_ratings(id,ratingvalue,tripid,userid)
我想获取 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 table 中有这样的数据:
从我尝试过的查询中,我可以得到这样的结果。
但我的问题是:获取 100 个按较高平均评分排序的最近旅行。
除了拒绝投票和关闭投票之外,任何人都可以对此有任何解决方案,或者任何人都可以给我一个提示,说明是否可以在单个查询中实现?谢谢。
一种选择是使用内嵌视图,首先获取“100 个最近的行程”。
然后将其加入 trip_ratings
,以计算 "average rating" 并按该结果排序。
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 添加其他表达式以使其更具确定性。
ORDER BY AVG(r.ratingvalue) DESC, m.tripcreatedat DESC, m.id DESC
这不是唯一的方法。还有其他方法可以达到相同的结果。
我在 mysql 数据库中有两个 table:
- trips(id,name,desc,createdat)
- trip_ratings(id,ratingvalue,tripid,userid)
我想获取 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 table 中有这样的数据:
从我尝试过的查询中,我可以得到这样的结果。
但我的问题是:获取 100 个按较高平均评分排序的最近旅行。
除了拒绝投票和关闭投票之外,任何人都可以对此有任何解决方案,或者任何人都可以给我一个提示,说明是否可以在单个查询中实现?谢谢。
一种选择是使用内嵌视图,首先获取“100 个最近的行程”。
然后将其加入 trip_ratings
,以计算 "average rating" 并按该结果排序。
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 添加其他表达式以使其更具确定性。
ORDER BY AVG(r.ratingvalue) DESC, m.tripcreatedat DESC, m.id DESC
这不是唯一的方法。还有其他方法可以达到相同的结果。