2015-03-30 39 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