Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最大id的MySQL左连接_Mysql_Sql - Fatal编程技术网

最大id的MySQL左连接

最大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

我有一个名为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.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谢谢,我也添加了一些解释。我怀疑这个查询有点混乱。看见