JOIN 中的 MySQL LIMIT

Are*_*yan 5 mysql join subquery limits

我有一个 1:m 协会。

symbols表中有很多行company_key_statisticscompany_key_statistics有一个时间戳列createdAt,指示行的创建时间。我需要加入最新symbolscompany_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

我怎样才能做到这一点?

Dar*_*rio 2

尝试这个:

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 答案都处理它。例如检查这个。