最大id的MySQL左连接
我有一个名为tbl_messages的表,其中包含消息。如果是第一条消息,则每条消息的MessageReply下的值为0,如果是对另一条消息的答复,则消息id为0 我需要获得每个根消息的数据+最新响应的日期 我正在运行以下SQL过程:最大id的MySQL左连接,mysql,sql,Mysql,Sql,我有一个名为tbl_messages的表,其中包含消息。如果是第一条消息,则每条消息的MessageReply下的值为0,如果是对另一条消息的答复,则消息id为0 我需要获得每个根消息的数据+最新响应的日期 我正在运行以下SQL过程: SELECT m1.*, m2.MessageID, m2.MessageDate FROM tbl_messages as m1 LEFT JOIN tbl_messages as m2 ON m1.MessageID = m2
SELECT
m1.*, m2.MessageID, m2.MessageDate
FROM
tbl_messages as m1 LEFT JOIN tbl_messages as m2
ON
m1.MessageID = m2.MessageReply
WHERE
m1.MessageReply = '0' AND
(m1.MessageUser = '1' OR m1.MessageBusiness = '1') AND
m2.MessageID = (SELECT MAX(MessageID) FROM tbl_messages WHERE MessageReply = m1.MessageID)
ORDER BY
m2.MessageID desc, m1.MessageID desc
我的问题是,由于最后一个WHERE语句,它不返回左表中的值,而右表中没有值
如何解决它?当您在
WHERE
子句中编写语句时,它将过滤整个查询结果
当您在联接左表时在ON
子句中写入该语句时,它只会过滤左联接表,若语句不匹配,则结果将是次表中的NULL
值
SELECT
m1.*, m2.MessageID, m2.MessageDate
FROM
tbl_messages as m1 LEFT JOIN tbl_messages as m2
ON
m1.MessageID = m2.MessageReply
AND
m2.MessageID = (SELECT MAX(MessageID) FROM tbl_messages WHERE MessageReply = m1.MessageID)
WHERE
m1.MessageReply = '0' AND
(m1.MessageUser = '1' OR m1.MessageBusiness = '1')
ORDER BY
m2.MessageID desc, m1.MessageID desc
如果您的id是增量的,您应该能够使用MAX()获取最新/最高日期和id
SELECT
m1.*,
MAX(m2.MessageID) AS reply_id,
MAX(m2.MessageDate) AS reply_date
FROM
tbl_messages as m1
LEFT JOIN tbl_messages as m2 ON
(
m1.MessageID = m2.MessageReply
)
WHERE
m1.MessageReply = '0' AND
(m1.MessageUser = '1' OR m1.MessageBusiness = '1')
GROUP BY
m1.MessageID
ORDER BY
reply_date DESC,
m1.MessageID DESC
如果您的id不是增量的,那么您可以第三次加入表,并有一个更晚的响应,而没有更晚响应的那一行就是最新的响应
SELECT
m1.*,
m2.MessageID AS reply_id,
m2.MessageDate AS reply_date
FROM
tbl_messages as m1
LEFT JOIN tbl_messages as m2 ON
(
m1.MessageID = m2.MessageReply
)
LEFT JOIN tbl_messages as m3 ON
(
m1.MessageID = m3.MessageReply AND
m3.MessageDate > m2.MessageDate
)
WHERE
m1.MessageReply = '0' AND
(m1.MessageUser = '1' OR m1.MessageBusiness = '1') AND
m3.MessageReply IS NULL
GROUP BY
m1.MessageID
ORDER BY
reply_date DESC,
m1.MessageID DESC
您可能希望通过以下方式合并您的订单,以获取没有回复的消息,并最终到达您想要的位置,例如:
合并订单(m2.MessageDate,m1.MessageDate)DESC
这是不公平的。我会给你一个更新来补偿!此外,你的问题似乎还可以。请解释一下为什么将该条件从何处移至ON。@jarlh谢谢,我也添加了一些解释。我怀疑这个查询有点混乱。看见