这不是如何针对速度优化以下查询的问题,我知道可以进行改进,但这与语句的功能有关,而这似乎并没有正确地选择数据。 / 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;
如上所述,这有时会优先考虑已经收到消息的用户,优先于从未收到消息的用户。如果有人能够从此查询中发现错误,则会非常感谢您的回复。
答案 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
。
使用ASC
或DESC
可能会导致您在这些值的展示位置中看到的差异。