Are*_*yan 5 mysql join subquery limits
我有一个 1:m 协会。
symbols
表中有很多行company_key_statistics
。company_key_statistics
有一个时间戳列createdAt
,指示行的创建时间。我需要加入最新symbols
的company_key_statistics
,但我只需要最新的company_key_statistics
。例如,我需要获取ORCL
并且MSFT
symbols
仅获取他们最新的company_key_statistics
.
到目前为止我已经尝试过了。
SELECT `symbols`.`id`,
`symbols`.`symbol`,
`statistics`.
`marketCapitalization`
FROM `symbols`
LEFT JOIN (SELECT `s`.`companyId`,
`s`.`marketCapitalization`
FROM `company_key_statistics` AS `s`
WHERE `s`.`companyId` = `symbols`.`id`
ORDER by `createdAt`
DESC LIMIT 1) AS `statistics`
ON `symbols`.`id` = `statistics`.`companyId`
WHERE `symbols`.`symbol` IN ('ORCL', 'SNAP');
Run Code Online (Sandbox Code Playgroud)
但不幸的是我发现我不能在子查询中使用父查询中的列JOIN
。
我怎样才能做到这一点?
尝试这个:
SELECT sym.id, sym.symbol, s.marketCapitalization
FROM symbols AS sym
INNER JOIN company_key_statistics AS s
ON sym.id = s.companyId
INNER JOIN (SELECT companyId, MAX(createdAt) AS createdAt
FROM company_key_statistics
GROUP BY companyId) AS smax
ON smax.companyId = s.companyId AND smax.createdAt = s.createdAt
WHERE sym.symbol IN ('ORCL','SNAP');
Run Code Online (Sandbox Code Playgroud)
由于您发布的示例是LEFT JOIN
,也许您还希望答案中没有市值数据的公司。在这种情况下,我们必须嵌套子选择,如下所示:
SELECT sym.id, sym.symbol, s.marketCapitalization
FROM symbols AS sym
LEFT JOIN (SELECT *
FROM company_key_statistics
INNER JOIN (SELECT companyId, MAX(createdAt) AS createdAt
FROM company_key_statistics
GROUP BY companyId) AS smax
USING (companyId, createdAt)) AS s
ON sym.id = s.companyId
WHERE sym.symbol IN ('ORCL','SNAP');
Run Code Online (Sandbox Code Playgroud)
我们在这里解决的一般问题称为分组最大值,许多 SO 和 DBA.SE 答案都处理它。例如检查这个。
归档时间: |
|
查看次数: |
39720 次 |
最近记录: |