2015-12-22 47 views
0

這不是一個如何優化以下速度查詢的問題,我知道可以進行一些改進,但是這與語句的功能有關,這似乎不是正確選擇數據。MySQL選擇順序的問題

問題:

下面的查詢應該從用戶名列表中選擇用戶,通過當他們最後一次傳遞消息(最前)進行排序。此列表中的某些用戶名將永遠不會被髮送,因此last_message_date將爲NULL。但是,當前語句會返回一條命令,將last_message_date爲NULL的用戶放入已經發送消息的用戶(即,last_message_date包含日期)。

奇怪的是偶爾它會返回它正確排序,NULL先,其他時間不會。我在這裏撓頭。

代碼:

SELECT DISTINCT username 
FROM `account_usernames` 
WHERE (`in_progress` = 0) 
    AND (account_source IN 
     (SELECT DISTINCT `username` 
      FROM source_accounts 
      WHERE group_users = 'USA Based' 
      AND (`type` = 'users' 
       OR `type` = 'both') 
      AND `use` = '1')) 
    AND (username NOT IN 
     (SELECT user_tomsg 
      FROM `message_history` 
      WHERE owner_account = 'CurrentOwner')) 
    AND (username NOT IN 
     (SELECT DISTINCT `username` 
      FROM `follower_list`)) 
ORDER BY last_message_date LIMIT ? 
FOR 
UPDATE; 

至於說,這個偶爾會優先考慮誰已經已經傳遞消息,上面誰從未傳遞消息的用戶。如果有人能夠從這個查詢中發現錯誤,我們將熱烈感謝回覆。使用ORDER BY

ORDER BY (last_message_date is null) desc, 
     last_message_date 

documentation是在哪裏NULL s的放置清晰:

回答

2

如果你想NULL值,再明確地在ORDER BY這麼說

在做的ORDER BY,NULL值首先顯示,如果你做 ORDER BY ... ASC如果你做ORDER BY ... DESC

使用ASCDESC可能會導致您在這些值的佈局中看到的差異。