mysql - ORDER BY 语句中的 IF...ELSE 或 CASE
Posted
技术标签:
【中文标题】mysql - ORDER BY 语句中的 IF...ELSE 或 CASE【英文标题】:mysql - IF...ELSE or CASE in ORDER BY statement 【发布时间】:2020-04-14 19:10:47 【问题描述】:在下面的查询中,我没有得到想要的结果。我希望根据两个不同表的两个不同日期字段根据最新事件发生对结果进行排序。我们先看看查询。
SELECT R1.swp_to, R1.swp_type, R1.swp_date, M.mem_fname, M.mem_lname, M.mem_last_activity, DP.dp_photo, GREATEST(R1.swp_date, R2.swp_date) FROM swipes AS R1
LEFT JOIN swipes AS R2 ON(R1.swp_to = R2.swp_by AND R2.swp_to = R1.swp_by AND R2.swp_type <> 'left')
LEFT JOIN members AS M ON(R1.swp_to = M.mem_id)
LEFT JOIN display_photos AS DP ON(R1.swp_to = DP.dp_mem AND DP.dp_index = 1)
LEFT JOIN messages as MSG ON ((R1.swp_to = MSG.msg_from OR R1.swp_to = MSG.msg_to) AND (R1.swp_by = MSG.msg_from OR R1.swp_by = MSG.msg_to))
WHERE R1.swp_by = :mem AND R2.swp_by IS NOT NULL AND R1.swp_type <> 'left'
ORDER BY IF(MSG.msg_time IS NULL, 0, 1), R1.swp_date
在ORDER BY
语句中,我们可以看到msg_time
和swp_date
有两个TIME 字段。每当有新匹配 swp_date
更新时,当有新消息 msg_time
更新时。使用此查询获取的记录必须按照最近发生的事件进行排序(以两者中最早的日期为准)。我当前的ORDER BY
语句不符合要求。我在这里错过了什么?
【问题讨论】:
LEFT JOIN swipes AS R2
是由于WHERE ... R2.swp_by IS NOT NULL
而成为 INNER JOIN。
@Akina 这对这里有什么帮助?
...根据最近的事件发生... 然后...以两者中最早的日期为准...这需要澄清。
没有什么能帮上忙——你想要“根据最近发生的事件排序”需要分组(显式或隐式作为窗口函数或子查询)——但它不存在。 这对这里有什么帮助?一个错误不能解决问题并不意味着它不应该被修复。
@forpas 我不知道如何让它更清楚。假设我在下午 6:30(记录在 swp_date
)收到了新的比赛,然后我在下午 6:31(记录在 msg_time
)收到了一条新消息,那么下午 6:31 的记录应该在顶部。之后,假设我在下午 6 点 35 分再次收到新的比赛,那么现在这是最新记录,它应该排在最前面,然后是下午 6 点 31 分的上一个记录。这里的排序基于两个不同的日期字段,以最早的记录为准。我不能再简化它了。希望这会有所帮助:)
【参考方案1】:
可以使用GREATEST()
函数:
ORDER BY GREATEST(COALESCE(MSG.msg_time, R1.swp_date), R1.swp_date) DESC
【讨论】:
这段代码很明显,它按两个日期中最大的日期对结果进行排序。如果这不是你想要的,你必须编辑你的问题并解释。 我在 6 分钟前有一个新匹配,它在顶部,而 3 分钟前收到的一条消息在底部。该消息应自动放在最前面,因为它是最早收到的。 两条消息的两列的值是多少? 即使我明白它应该通过排序两者之间最大的一个来工作,但它不工作/排序。 谢谢你.. 如果没有你的帮助,我会一直卡在那里。我很欣赏你的努力,真的。再次感谢:)以上是关于mysql - ORDER BY 语句中的 IF...ELSE 或 CASE的主要内容,如果未能解决你的问题,请参考以下文章
简述SELECT语句中的FROM、WHERE以及ORDER BY子句的作用。SQL Server
mysql GROUP BY、DISTINCT、ORDER BY语句优化