Php MySQL选择排序的问题

Php MySQL选择排序的问题,php,mysql,sql,Php,Mysql,Sql,这不是如何优化下面的查询以提高速度的问题,我知道可以进行一些改进,但这与语句的功能有关,它似乎没有正确地选择数据 问题: SELECT DISTINCT username FROM `account_usernames` WHERE (`in_progress` = 0) AND (account_source IN (SELECT DISTINCT `username` FROM source_accounts WHERE grou

这不是如何优化下面的查询以提高速度的问题,我知道可以进行一些改进,但这与语句的功能有关,它似乎没有正确地选择数据

问题:

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;
下面的查询应该从用户名列表中选择用户,并按上次发送消息的时间(最早的时间)对其排序。此列表中的某些用户名从未发送过消息,因此,
last\u message\u date
将为
NULL
。但是,当前语句返回一个顺序,该顺序将已发送消息的用户(即,last_message_date包含日期)置于具有
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;

如前所述,这偶尔会优先考虑已经发过消息的用户,而不是从未发过消息的用户。如果任何人都能从这个查询中发现错误,我们将非常感谢您的回复。

如果您首先想要
NULL
值,那么请在
顺序中明确说明:

ORDER BY (last_message_date is null) desc,
         last_message_date
使用
订购人时,
NULL
s的位置清晰可见:

ORDER BY (last_message_date is null) desc,
         last_message_date
在按进行
排序时,如果执行,则首先显示
NULL
按……订购。。。ASC
和最后一个,如果您按。。。描述

使用
ASC
DESC
可能是您在这些值的位置上看到的差异的原因