我有這樣的查詢:SELECT * FROM table WHERE id IN (2,4,1,5,3);
MySQL的自定義排序
然而,當我把它打印出來,它的自動排序1,2,3,4,5。我們如何在不改變數據庫結構的情況下維護訂單(2,4,1,5,3)?
謝謝!
我有這樣的查詢:SELECT * FROM table WHERE id IN (2,4,1,5,3);
MySQL的自定義排序
然而,當我把它打印出來,它的自動排序1,2,3,4,5。我們如何在不改變數據庫結構的情況下維護訂單(2,4,1,5,3)?
謝謝!
我想問:
我得到的答案和所有的功勞屬於他們是:
可以使用CASE運營商指定的順序:
SELECT * FROM table
WHERE id IN (3,6,1,8,9)
ORDER BY CASE id WHEN 3 THEN 1
WHEN 6 THEN 2
WHEN 1 THEN 3
WHEN 8 THEN 4
WHEN 9 THEN 5
END
in php u can do it like:
<?php
$my_array = array (3,6,1,8,9) ;
$sql = 'SELECT * FROM table WHERE id IN (3,6,1,8,9)';
$sql .= "\nORDER BY CASE id\n";
foreach($my_array as $k => $v){
$sql .= 'WHEN ' . $v . ' THEN ' . $k . "\n";
}
$sql .= 'END ';
echo $sql;
?>
SELECT * FROM table WHERE id IN (2,4,1,5,3) ORDER BY FIELD(id,2,4,1,5,3);
來源:http://imthi.com/blog/programming/mysql-order-by-field-custom-field-sorting.php
你爲我節省了很多時間和編碼!謝謝... – 2013-01-02 11:44:03
通過現場的訂貨,我從來沒有做過。我的國家的名單,我需要美國和加拿大出現在列表的頂部,所以我的查詢是這樣的:
SELECT * FROM countries ORDER BY code='USA', code='CAN', name ASC
這從來沒有工作過,但我意識到,排序是不同的,它是顯示加拿大和國家在名單的末尾,所以我這樣做:
SELECT * FROM countries ORDER BY code!='USA', code!='CAN', name ASC
它的工作......爲什麼?打敗我,但它只是;嘗試一下。
(我會寫,這個是米歇爾託邦的答案評論,但沒有聲譽,對不起:-)
「和它的工作......爲什麼呢?我就不清楚了,但它只是做;嘗試一下。「
工作原因是因爲你的表達式「code!='USA'」產生一個布爾結果,它在SQL中表示爲1或0.因此,表達式「code ='USA'產生一個1對於每個符合該條件的記錄,每個記錄沒有0的記錄,因爲1在升序排序(缺省值)中晚於0,所以匹配的記錄比不匹配的記錄排序晚,因此否定該表達式會產生相反的效果。
產生相同的結果將如下的另一種(可能更清楚)的方式如下:
SELECT * FROM countries ORDER BY code='USA' DESC, code='CAN' DESC, name ASC
當然在聽到OP的問題,我最喜歡FIELD()選項 - 非常乾淨:-)
解釋得很好。 – ChristianLinnell 2013-03-16 22:46:46
感謝:-)(我有足夠的聲望來評論吧!:-D) – opensourcejunkie 2013-05-20 16:03:20
Lucas Rossini Ferreira的解決方案比這更簡單。 – mkataja 2012-08-21 12:24:29
是的,你是對的 – 2012-08-21 13:17:59