【发布时间】: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 分的上一个记录。这里的排序基于两个不同的日期字段,以最早的记录为准。我不能再简化它了。希望这会有所帮助:)
标签: mysql sql pdo sql-order-by