2014-06-21 41 views
0

下面是我的表的副本。正如您在下面看到的,該行是按ID和日期排序的。按點和日期排序表

id  |  date   | points 
1   Jan 1, 2014    110 
2   Feb 12, 2014   20 
3   Mar 23, 2014   40 
4   Apr 10, 2014   80 
5   May 20, 2014   30 
6   June 3, 2014   60 
7   Jan 15, 2014   10 
8   Mar 5, 2014    70 
9   Feb 8, 2014    50 
10   June 10, 2014   5 

我的目標是按50到10之間的點數(從最高到最低)和從最近到最近的日期排序。我怎樣才能做到這一點?

所有行必須作爲一個最終結果

+0

你能提供結果應該是什麼樣子嗎?不清楚你想要的行是否位於10-50之外,如果是的話應該如何排序 – Lennart

回答

0

類似的東西:

SELECT *, CASE WHEN (points >= 10 AND points <= 50) THEN 1 ELSE 0 END AS order_points  
    FROM points 
ORDER BY 
    order_points DESC, 
    CASE 
     WHEN order_points = 1 THEN points 
    END DESC, DATEDIFF(date, NOW()) 
+0

就像我說過的:「所有行必須包含爲最後結果」。這將排除一些行 – user3740975

+0

如果你想要50到10之間的點,你不會有你所有的行,或者我不明白? –

+0

我只想要50-10之間的任何行與當前日期中最接近的位於頂部,其他行將移動到行的底部。 – user3740975

0

猜測一下:

select a_date,points 
from t 
order by case when points between 10 and 50 then -1 else 1 end * points 
    , abs(DATEDIFF(a_date, now())); 

爲您的數據的一個子集:

+------------+--------+ 
| a_date  | points | 
+------------+--------+ 
| 2014-03-23 |  40 | 
| 2014-02-12 |  20 | 
| 2014-06-10 |  5 | 
| 2014-04-10 |  80 | 
| 2014-01-01 | 110 | 
+------------+--------+ 
+0

它不工作,錯誤說你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'10點到50點之間按順序使用正確的語法',然後在第10行使用'1'結束*點' – user3740975

+0

如果是mysql,爲什麼不標記它像那樣?現在我猜想,無論如何,用'5.5.37-MariaDB'來測試它。你使用什麼版本? – Lennart

+0

你可以創建一個小提琴。案件的一部分是沒有任何意義 – user3740975

0
SELECT * 
FROM MyTable 
order by CASE WHEN Points BETWEEN 10 AND 50 THEN 0 ELSE 1 END, TheDate desc; 

ID TheDate Points 
-- --------- ------ 
5 20-MAY-14  30 
3 23-MAR-14  40 
2 12-FEB-14  20 
9 08-FEB-14  50 
7 15-JAN-14  10 
10 10-JUN-14  5 
6 03-JUN-14  60 
4 10-APR-14  80 
8 05-MAR-14  70 
1 01-JAN-14  110