给定两个表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中没有任何记录,这也是我需要的。有什么帮助吗?
答案 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来提高效率。