MySQL SELECT排序问题

时间:2015-12-22 11:49:13

标签: php mysql sql

这不是如何针对速度优化以下查询的问题,我知道可以进行改进,但这与语句的功能有关,而这似乎并没有正确地选择数据。 / p>

问题:

以下查询应从用户名列表中选择用户,按照上次发送消息(最早的第一个)进行排序。此列表中的某些用户名从未收到过消息,因此last_message_date将为NULL。但是,当前语句返回一个命令,该命令将已经被消息的用户(即last_message_date包含日期)放在last_message_date为NULL的用户之前。

奇怪的是偶尔它会正确地返回它,首先是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;

如上所述,这有时会优先考虑已经收到消息的用户,优先于从未收到消息的用户。如果有人能够从此查询中发现错误,则会非常感谢您的回复。

1 个答案:

答案 0 :(得分:2)

如果您首先要NULL个值,请在ORDER BY中明确说明:

ORDER BY (last_message_date is null) desc,
         last_message_date

使用NULL时,documentation清楚显示ORDER BY的位置:

  

执行ORDER BY时,如果您这样做,则会先显示NULL个值   ORDER BY ... ASC {if} ORDER BY ... DESC

使用ASCDESC可能会导致您在这些值的展示位置中看到的差异。