2013-04-15 41 views
0

我想用mysql進行特定排序。這裏是表我有mysql按大小寫排序時

id  fb_id ... date_added 
1  1111111111 2013-04-15 14:15:00 
2  1111111111 2013-04-15 14:16:00 
3  1111111111 2013-04-15 14:17:00 
4  2222222222 2013-04-15 14:18:00 
5  3333333333 2013-04-15 14:19:00 
6  4444444444 2013-04-15 14:20:00 
7  2222222222 2013-04-15 14:21:00 
8  1111111111 2013-04-15 14:22:00 

我所期待是fb_id 111111111和2222222222第一,然後以按最新日期的順序是這樣休息...

id  fb_id ... date_added 
1  1111111111 2013-04-15 14:22:00 
2  2222222222 2013-04-15 14:21:00 
3  2222222222 2013-04-15 14:18:00 
4  1111111111 2013-04-15 14:17:00 
5  1111111111 2013-04-15 14:16:00 
6  1111111111 2013-04-15 14:15:00 
7  4444444444 2013-04-15 14:20:00 
8  3333333333 2013-04-15 14:19:00 

SQL我試着:

SELECT `id`, `fb_id`, `date_added` from MyTable 
ORDER BY case when fb_id in (1111111111,2222222222) then -1 else date_added end, date_added desc 

它排序fb_id第一,但其餘的數據不被「DATE_ADDED降序」排序?請幫忙..

+0

爲什麼'2222222222'後面還有'1111111111'? –

回答

6

您正在按date_added排序,先由於您的ELSE子句。請嘗試:

ORDER BY case when fb_id in (1111111111,2222222222) then 0 else 1 end, 
    date_added desc 
+0

非常感謝它解決了! :) – zaw

2

使用基於行的函數的解決方案應仔細研究,它們有時會在您嘗試擴展時導致問題。

如果您的表仍然比較小,這不應該是一個問題,但是,如果你擔心,你可以嘗試這樣的:

select 1 as seq, id, fb_id, date_added 
    where fb_id in (1111111111,2222222222) 
union all select 2 as seq, id, fb_id, date_added 
    where fb_id not in (1111111111,2222222222) 
order by seq, fb_id, date_added desc 

這導致兩個查詢到DBMS但可以通常比訂購前在結果集的每一行上執行額外處理要快。

與所有解決方案一樣,您應該測量影響而不是猜測,並使用具有代表性的數據進行測量。

+0

我不認爲我的桌子會這麼大,但這可能是更好的方式,如果它曾經謝謝! – zaw