2013-04-01 71 views
1

這是一些排序:我有一個IDS,名稱和評級表。我想列出基於收視率最好的10個項目,這很好:兩個ORDER BY子句和一個LIMIT

SELECT id FROM items ORDER BY ratings DESC LIMIT 10 

但現在,這裏是最困難的部分:我想列出基於收視率最好的10個項目,但順序按字母順序。我試圖

SELECT id FROM items ORDER BY ratings DESC, names ASC LIMIT 10 

SELECT id FROM items ORDER BY names ASC, ratings DESC LIMIT 10 

但也給了想要的結果。

回答

7

你可以使用子查詢:

SELECT * 
FROM (
    SELECT id, names 
    FROM items 
    ORDER BY ratings DESC 
    LIMIT 10 
    ) t 
ORDER BY names 

編輯:進一步解釋

你原來的查詢按照等級DESC,然後由名字 - 它只是將具有相同的名稱進行排序收視率。所以如果兩個項目具有相同的評級,那麼你會得到這兩個按名稱排序。它將通過評分首先,然後通過名稱(在相同的評級之內)對所有記錄進行分類。

+0

但爲什麼原始查詢不起作用,我等待在答案中看到一些原因:) – 2013-04-01 17:37:48

+0

@Akam - 原始查詢按評級DESC排序,然後按名稱排序 - 它只會對具有相同評級的名稱進行排序。所以如果兩個項目具有相同的評級,那麼你會得到這兩個按名稱排序。它會先按照評分排序所有記錄,然後按名稱排序。讓我知道你是否需要進一步澄清。 – sgeddes

+0

謝謝任何​​方式,我沒有被問到這個問題,我只是想讓你解釋一下 – 2013-04-01 17:41:18

3
SELECT id, name, rating 
FROM 
    (SELECT id, name, rating FROM items ORDER BY ratings LIMIT 10) t 
ORDER BY name 

這將採用rating前10,然後按name排序。

您的查詢不正確,因爲:它們按名稱排序,然後按等級(或相反順序)排序,排序執行後排在前10位。您需要進行第一次排序,進入前10名,然後使用第二列值對這10個結果進行排序。