ORDER BY有两列

时间:2015-03-30 17:58:56

标签: php mysql sql database

我在mysql数据库中有两个表:

  1. 跳闸(ID,名称,内容描述,createdat)
  2. trip_ratings(ID,ratingvalue,TRIPID,用户ID)
  3. 我想按照较高的平均评分排序最近的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表中有这样的数据:

    enter image description here

    从我尝试过的查询中我可以得到这样的结果。 enter image description here

    但我的问题是:按平均评分较高的方式排名最近100次。

    有没有人可以为此提供任何解决方案,或者任何人都可以在一个查询中给我一个提示,而不是低估和关闭投票?感谢。

1 个答案:

答案 0 :(得分:1)

一种选择是使用内联视图,首先获得“最近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

这不是唯一的方法。还有其他方法可以达到同等效果。