2015-03-30 36 views
0

我在MySQL数据库中的两个表:ORDER BY有两列

  1. 人次(ID,姓名,递减,createdat)
  2. trip_ratings(ID,ratingvalue,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表中的数据是这样的:

enter image description here

,并从我试着查询我能得到这样的结果。 enter image description here

但我的问题是:获取最近的100条排序依据更高的平均评分。

而不是downvoting和关闭投票,任何人都可以有任何解决方案,或任何人都可以给我一个提示,这可能在一个单一的查询?谢谢。

+1

请添加示例数据和预期输出 – 2015-03-30 18:02:16

+0

@juergend我已经把理想的结果。和好的,等等,我正在编辑 – 2015-03-30 18:03:46

+6

@AmeyaDeshpande *“你可以只订单一列”* - 不真实。在这里,谷歌“通过MySQL多重订单”,你会看到很多结果。 – 2015-03-30 18:04:27

回答

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 

如果存在具有相同的平均评分多次往返,这是indeterminiate什么样的顺序那些将被退回。您可以添加其他表达式的顺序通过,使其更具有确定性。

ORDER BY AVG(r.ratingvalue) DESC, m.tripcreatedat DESC, m.id DESC 

这是不这样做的唯一途径。还有其他方法可以达到相同的结果。

+0

看起来像一个很好的解决方案...让我试试。谢谢 – 2015-03-30 18:20:47

+0

@Krupal:我第一次出现的一些错误(缺少GROUP BY子句,错误的列引用限定符),现在已修复。 – spencer7593 2015-03-30 18:21:43

+0

其确定...使用内连接而不是左连接工作正常。这里有什么重要的左连接? – 2015-03-30 18:25:20