2009-11-06 55 views
0

查詢表相關文章:mysql的ORDER_BY問題

select * from articles where article_id in(98,97,96,99) 

返回的結果排序像

record 96 ... 
record 97 ... 
record 98 ... 
record 99 ... 

但我更喜歡的結果排序相同, '在(98,97,96,99)'。任何技巧,使其成爲可能? 謝謝。

+0

你能否多說一點'問題域'?每個查詢的IN列表是否不同?無論ORDER BY方面如何,使用IN列表拉回數百行都不會縮小那麼遠。 – 2009-11-06 07:04:35

回答

1

中功能受到在列表的大小有限制。更有可能的是,一旦列表達到幾百條,你的表現就會下降 - 你也可以單獨檢索記錄並在客戶端排序。

話雖如此,還有另一個MySQL函數,FIND_IN_SET你可能會考慮實現你的ORDER BY。但FIND_IN_SET最多隻能處理64個成員。

ORDER BY 
    FIND_IN_SET(article_id, '98,97,96,99') 
1

我想這可能工作:

select * from articles where article_id in(98,97,96) order by article_id desc 
union 
select * from articles where article_id = 99 

我看不到你的訂貨任何圖案,所以我想不出任何其他方式來做到這一點。

+0

這看起來不可擴展到我,因爲article_id序列的順序可能是隨機的,因爲您說沒有模式。 – Shawn 2009-11-06 04:40:57

+0

96,97,98,99看起來像一個模式給我! – 2009-11-06 04:46:23

+0

@Shawn:如果您希望它具有可伸縮性,您可以動態構建查詢字符串: $ query =「select * from article whereid(」。$ in_list_1。「)order by article_id」。$ order1。「 union select * from article where article_id in(。「$ in_list_2」。)order by article_id「。$ order2 – FrustratedWithFormsDesigner 2009-11-06 04:49:54

1

肖恩,當您使用的說法,MYSQL

它的第一個記錄ID進行比較,你給出的ID。 然後將第二個記錄ID與您給定的ID進行比較。 所以...

所以結果將以asc順序顯示。

如果您需要不使用IN語句。我寧願在循環中檢索每條記錄。

三江源

+0

是的想法,但仍然不可擴展,我可以在'in'語句中擁有數百個id,不要認爲將查詢放入循環是一個好主意。感謝壽。 – Shawn 2009-11-06 04:59:22

+0

肯定會讓這個過程非常緩慢。但IN聲明不支持你提到 – sathish 2009-11-06 05:31:14

1

您也許能夠做這樣的事情:

select * from articles where article_id in(98,97,96,99) order by article_id == 98 desc, article_id == 97 desc, article_id == 96 desc, article_id == 99 desc; 
+0

不可擴展。如果我有500個ID,則查詢可能會變胖。 – Shawn 2009-11-06 04:57:05