2017-08-14 91 views
2

我的表SELECT FROM表,ORDER BY IF(...)

SELECT * FROM mail; 
+---------------------+---------+---------+---------+---------+---------+ 
| t     | srcuser | srchost | dstuser | dsthost | size | 
+---------------------+---------+---------+---------+---------+---------+ 
| 2014-05-11 10:15:08 | barb | saturn | tricia | mars | 58274 | 
| 2014-05-12 12:48:13 | tricia | mars | gene | venus | 194925 | 
| 2014-05-12 15:02:49 | phil | mars | phil | saturn | 1048 | 
| 2014-05-12 18:59:18 | barb | saturn | tricia | venus |  271 | 
| 2014-05-14 09:31:37 | gene | venus | barb | mars | 2291 | 
| 2014-05-14 11:52:17 | phil | mars | tricia | saturn | 5781 | 
| 2014-05-14 14:42:21 | barb | venus | barb | venus | 98151 | 
| 2014-05-14 17:03:01 | tricia | saturn | phil | venus | 2394482 | 
| 2014-05-15 07:17:48 | gene | mars | gene | saturn | 3824 | 
| 2014-05-15 08:50:57 | phil | venus | phil | venus |  978 | 
| 2014-05-15 10:25:52 | gene | mars | tricia | saturn | 998532 | 
| 2014-05-15 17:35:31 | gene | saturn | gene | mars | 3856 | 
| 2014-05-16 09:00:28 | gene | venus | barb | mars |  613 | 
| 2014-05-16 23:04:19 | phil | venus | barb | venus | 10294 | 
| 2014-05-19 12:49:23 | phil | mars | tricia | saturn |  873 | 
| 2014-05-19 22:21:51 | gene | saturn | gene | venus | 23992 | 
+---------------------+---------+---------+---------+---------+---------+ 

我有這樣

SELECT t, srcuser, dstuser, size 
    -> FROM mail 
    -> ORDER BY IF(srcuser='phil',0,1), srcuser, dstuser; 

查詢將產生

+---------------------+---------+---------+---------+ 
| t     | srcuser | dstuser | size | 
+---------------------+---------+---------+---------+ 
| 2014-05-16 23:04:19 | phil | barb | 10294 | 
| 2014-05-12 15:02:49 | phil | phil | 1048 | 
| 2014-05-15 08:50:57 | phil | phil |  978 | 
| 2014-05-14 11:52:17 | phil | tricia | 5781 | 
| 2014-05-19 12:49:23 | phil | tricia |  873 | 
| 2014-05-14 14:42:21 | barb | barb | 98151 | 
| 2014-05-11 10:15:08 | barb | tricia | 58274 | 
| 2014-05-12 18:59:18 | barb | tricia |  271 | 
| 2014-05-14 09:31:37 | gene | barb | 2291 | 
| 2014-05-16 09:00:28 | gene | barb |  613 | 
| 2014-05-15 07:17:48 | gene | gene | 3824 | 
| 2014-05-15 17:35:31 | gene | gene | 3856 | 
| 2014-05-19 22:21:51 | gene | gene | 23992 | 
| 2014-05-15 10:25:52 | gene | tricia | 998532 | 
| 2014-05-12 12:48:13 | tricia | gene | 194925 | 
| 2014-05-14 17:03:01 | tricia | phil | 2394482 | 
+---------------------+---------+---------+---------+ 

我不明白如何訂購.OK,phil是感興趣的名稱.Book說,假設您想對發件人/收件人 訂單中的郵件表消息進行分類,但您想先爲特定的發件人發送消息。爲什麼我們使用0,1?

回答

2

讓我們來看看下面的ORDER BY IF(srcuser='phil',0,1), srcuser, dstuser;

我們知道ORDER BY呢,所以我會忽略的是,除了說它訂單中列出的領域序列。

IF(srcuser='phil',0,1) 如果用戶是「菲爾」,我們的值0分配到臨時訂貨場,否則我們分配值1。由於這是第一場,並ORDER BY默認爲升序,如果沒有明確規定,我們先由那個臨時區域命令。任何具有0的項目都將是第一個(phil's),而具有1的任何項目都將在此之後(所有其他項目)。

然後對其他字段進行排序,爲您提供輸出結果集的順序。

基本上,0,1是幫助創建一個命令來排序項目,否則他們將在列表中的不同點。您可以將值更改爲2,5並獲得相同的結果。

最終,它實際上是說IF(srcuser='phil',x,y),其中x < y。如果您想更改訂單以便其他字段的遞減順序,您可以使用ORDER BY IF(srcuser='phil',x,y)... DESC,其中x > y

使用0和1的另一個原因是它們是數字,數字更易於對這些字母進行排序(計算)。使用IF(srcuser='phil','a','b')

2

0小於1,所以「0,1」確保你想要的物品最先到達。 IF語句返回0或1來包裝ORDER BY。

+0

可以達到相同的結果這是否意味着我可以放'0,2'? – MishaVacic

+0

是的我相信如此,或者「1,2」,如果這對你更有意義。 –

1

當按字段排序時,MySQL執行的操作是嘗試按升序對字段的值進行排序。

你的情況,你必須先解決mailsrcuser='phil',所以你需要添加一個「虛擬」的價值這樣做,因爲否則mail將獲得由srcuser排序(按名稱),所以phil將被排降低。

所以它的作用是讓phil發送的消息具有較低的值(因此按照ASC順序,它們將首先被排序),然後將相同的值(1)賦值給其餘的條目他們得到由ORDER BY條款的其餘排序(srcuser, dstuser

相關問題