Mysql 使用日期列左键联接最近一行
我正在尝试从主查询中没有的左连接中选择最新的行。这是我的SQL:Mysql 使用日期列左键联接最近一行,mysql,sql,Mysql,Sql,我正在尝试从主查询中没有的左连接中选择最新的行。这是我的SQL: SELECT * FROM messages LEFT JOIN users ON messages.message_to = users.user_id OR messages.message_user = users.user_id LEFT JOIN message_replies ON m
SELECT *
FROM messages
LEFT JOIN users
ON messages.message_to = users.user_id
OR messages.message_user = users.user_id
LEFT JOIN message_replies
ON messages.message_id = message_replies.message_reply_main
LEFT JOIN user_personal_information
ON users.user_id =
user_personal_information.user_personal_information_user
我想从以下位置选择最新的行:
LEFT JOIN message_replies
ON messages.message_id = message_replies.message_reply_main
我的列名为:message\u reply\u date-如何使用该列左键加入最新的行
留言和答复:
我将其用于WHERE条款:
WHERE m.message_user = ?
OR m.message_to = ?
AND m.message_deleted=0
AND m.message_permdeleted=0
GROUP BY mr.message_reply_main
ORDER BY mr.message_reply_date DESC
有一个左连接方法用于获取最近的消息以及其他几个消息。但与问题的首选联接方法一致:
SELECT *
FROM messages m LEFT JOIN
users u
ON m.message_to = u.user_id OR m.message_user = u.user_id LEFT JOIN
message_replies mr
ON m.message_id = mr.message_reply_main LEFT JOIN
user_personal_information upi
ON u.user_id = upi.user_personal_information_user LEFT JOIN
message_replies mr2
ON mr2.message_reply_main = m.message_id AND
mr2.message_reply_date > mr.message_reply_date
WHERE mr2.message_reply_main IS NULL;
我还添加了表别名,因为它们使查询更易于编写和读取
这样做的目的是再次与表匹配,但仅用于以后的消息。然后,WHERE子句检查是否不存在,因此它有最新的一个
SELECT *
FROM messages
LEFT JOIN users
ON messages.message_to = users.user_id
OR messages.message_user = users.user_id
LEFT JOIN ( SELECT *
, MAX(message_reply_date) OVER (PARTITION BY message_id) AS most_recent_message_reply_date
FROM message_replies ) message_replies
ON messages.message_id = message_replies.message_reply_main
AND message_replies.message_reply_date = message_replies.most_recent_message_reply_date
LEFT JOIN user_personal_information
ON users.user_id =
user_personal_information.user_personal_information_user
我已将您对message_replies表的直接调用替换为Select,该选项显示该表以及按message_id分组的最大答复日期。然后,我已将其包括在联接中,以筛选除您要查找的答复之外的所有答复
试一试,有任何问题请给我留言,随时乐意帮助。如果我理解了问题,我会这样做:
SELECT *
FROM messages
LEFT JOIN users
ON messages.message_to = users.user_id OR messages.message_user = users.user_id
LEFT JOIN message_replies
ON messages.message_id = message_replies.message_reply_main
LEFT JOIN user_personal_information
ON users.user_id = user_personal_information.user_personal_information_user
WHERE message_replies.message_reply_date = (SELECT MAX(message_reply_date) FROM message_replies WHERE message_reply_main = messages.message_id)
/* AND more criterias */
在主查询中不进行分组,而只是在子查询中使用消息回复日期的最大求值,该求值与消息回复日期本身的WHERE条件有关。您要做的是模拟MSSQL&PL/SQL中的排名和分区功能,基本上是按消息回复日期和分区进行排名 这可以在MySQL中使用外部连接来完成&在分区上使用计数,同时在连接中使用<或>作为排名标准。这允许您执行标准联接,但也允许在rank=1时执行,返回最大日期
SELECT *
FROM messages
LEFT JOIN users
ON messages.message_to = users.user_id
OR messages.message_user = users.user_id
LEFT JOIN (select mri.message_reply_main
, mri.message_reply_date
, mri.message_reply_message
, mri.message_reply_read
, count(mri2.message_reply_main) + 1 as rank
FROM message_replies mri
left join message_replies mri2 on mri.message_reply_date < mri2.message_reply_date
and mri.message_reply_main = mri2.message_reply_main
group by mri.message_reply_main, mri.message_reply_message
, mri.message_reply_read, mri.message_reply_date) mr ON messages.message_id = mr.message_reply_man
AND mr.rank = 1
LEFT JOIN user_personal_information
ON users.user_id =
user_personal_information.user_personal_information_user
这似乎是得到最新的答复第二次答复,但如果我再次答复,它仍然显示第二次答复,直到我重复最后一次加入:s@randommman . . . 我不知道你说的是什么意思,直到我重复最后一次加入,它才会显示第二次回复。当然,当查询运行时,您会得到最新的答复。如果基础数据发生更改,您需要再次运行查询。好的,例如,创建一条消息并回复,回复显示,如果我再次回复出现的消息是应该的,但是如果我第三次回复,则第二条回复仍然是最后一条要显示的消息,即使它应该是第三条。PDOStatement::execute:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在第9行使用near“PARTITION BY messages.message_id作为最新的_message_reply_date”,因为代码是在MSSQL而不是MySQL上编写的。不确定MySQL中是否有直接等效的nt。你能试着运行内部select for me:select*,MAXmessage\u reply\u date中的代码吗?按message\u id划分为最新的\u message\u reply\u date,从message\u replies看来这种方法在MYSQL中无效。有些东西不能准确地从MSSQL转换到MYSQL。希望它能给你一些想法,并引导你找到答案。是的,你使用的是MAX的窗口函数版本。MySQL目前不支持窗口函数,而且可能永远也不会支持。如果两个回复具有相同的消息回复日期,该怎么办?这不太可能,但也不是不可能,而且对于合成生成的测试数据,这可能不太可能。如果两行包含完全相同的datetime值,则使用此方法将返回两行,即,两行的延迟相同,因为它们都共享秩1。
SELECT *
FROM messages
LEFT JOIN users
ON messages.message_to = users.user_id
OR messages.message_user = users.user_id
LEFT JOIN (select mri.message_reply_main
, mri.message_reply_date
, mri.message_reply_message
, mri.message_reply_read
, count(mri2.message_reply_main) + 1 as rank
FROM message_replies mri
left join message_replies mri2 on mri.message_reply_date < mri2.message_reply_date
and mri.message_reply_main = mri2.message_reply_main
group by mri.message_reply_main, mri.message_reply_message
, mri.message_reply_read, mri.message_reply_date) mr ON messages.message_id = mr.message_reply_man
AND mr.rank = 1
LEFT JOIN user_personal_information
ON users.user_id =
user_personal_information.user_personal_information_user