MySQL Left加入最新记录

时间:2016-02-23 02:50:19

标签: mysql group-by left-join

给定两个表A和B,我想要A中的所有记录,其中A.Param =“X”。我还想在B上进行LEFT JOIN,其中B包含各种A.Ids的试验记录,用于各种实验m,n,o ...

B上的记录的时间戳为B.TrialTime(DateTime)。随着设计的进行,同一个实验可以进行多次试验,同样的A.Id在B中,为了LEFT JOIN的目的,我只需要最新的试验。这就是我想出的:

SELECT A.*, B.Experiment, B.Response, B.Evaluation, MAX(B.TrialTime) FROM A
LEFT JOIN B ON B.UserID = A.ID
WHERE A.Param = "X" GROUP BY concat(B.UserID, B.Experiment)

问题是,它不再作为LEFT JOIN,即我没有从A获得所有用户,即使他们在B中没有任何记录,这也是我需要的。有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

如果无法访问表格的具体内容,您遇到的问题就是了解最近的问题。审判(表B)

在许多rdbms中,可以使用ROW_NUMBER()来解决这个问题,但是MySQL还没有提供那么有用的功能。所以你需要做这样的事情:

SELECT
        a.*
      , b.*
FROM A
        LEFT JOIN
        (
                SELECT
                        bb.*
                FROM B bb
                        INNER JOIN
                        (
                                SELECT
                                        UserID
                                      , MAX(TrialTime) MostRecent
                                FROM B
                                GROUP BY B.UserID
                        ) bmax ON bb.UserID = bmax.UserID
                                AND bb.TrialTime = bmax.MostRecent
        ) b ON B.UserID = A.ID

基本上,不可能同时获得某些列的MAX(),以及来自该行的所有其他列值#34;"您需要获取MAX(TrialTime)然后再连接到同一个表以获取相应的行。

为了进行比较,如果row_number()可用,则可以这样做:

SELECT
        a.*
      , b.*
FROM A
        LEFT JOIN
        (
                SELECT
                        bb.*
                      , ROW_NUMBER() OVER (PARTITION BY bb.userid 
                                           ORDER BY bb.TrialTime DESC) AS rn
                FROM B bb
        ) b ON B.UserID = A.ID
                AND b.rn = 1

顺便说一下,使用LEFT [OUTER] JOIN没有任何具体原因。如果您希望A中的行在B中没有连接数据,那么您需要一个外连接,否则您应该使用INNER JOIN来提高效率。