Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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
Mysql 使用日期列左键联接最近一行_Mysql_Sql - Fatal编程技术网

Mysql 使用日期列左键联接最近一行

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

我正在尝试从主查询中没有的左连接中选择最新的行。这是我的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 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