gpt4 book ai didi

MySQL Left Join 与最新记录

转载 作者:行者123 更新时间:2023-11-29 21:24:38 24 4
gpt4 key购买 nike

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

B 上的记录的时间戳为 B.TrialTime (DateTime)。随着设计的进行,B 中的相同 A.Id 可以对同一实验进行多次试验,并且为了 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)

问题是,它不再充当左连接,即我没有从 A 获取所有用户,即使他们在 B 中没有任何记录,这正是我所需要的。有什么帮助吗?

最佳答案

无法访问表格的具体信息,您面临的问题是了解“最新”试验(在表 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() 以及“从该行”的所有其他列值。您需要获取 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 来提高效率。

关于MySQL Left Join 与最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35567892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com