首页 > 解决方案 > 如果当天的数据不适用于 MySQL,则获取最新数据

问题描述

我有一个大型 SQL 查询(MySQL 5.7.32),它获取各种数据,并且包括特定日期的定价数据,如果这一天有可用的价格数据。通过一个简单的 LEFT JOIN 完成:

SELECT *
FROM merchants m CROSS JOIN products p
LEFT JOIN prices mps
    ON m.id = mps.id AND p.article_id = mps.article_id AND mps.DATE = $date

在某些情况下,这一天没有价格。在这种情况下,我想获得最近的可用价格。

这是否可以通过 LEFT JOIN 实现,或者我是否必须为我的语句添加更多复杂性?

标签: mysqlgreatest-n-per-group

解决方案


对的,这是可能的

SELECT m.*, t.*
FROM merchants m
JOIN (
    SELECT MAX(`date`) as max_date, id
    FROM prices
    WHERE `date` <= ?
    GROUP BY id
) t ON t.id = m.id

编辑:2步查询

假设您的商店每页显示 20 种产品。您可以像这样运行第一个查询:

SELECT m.*
FROM merchants m
WHERE some_criterias
LIMIT 20 OFFSET 0

然后将第一个查询的结果传递给第二个:

SELECT m.*, t.*
FROM merchants m
JOIN (
    SELECT MAX(`date`) as max_date, p.merchant_id
    FROM prices p
    AND merchant_id IN (?, ?, ?...)
    WHERE `date` <= ?
    GROUP BY id
) t ON t.merchant_id = m.id

推荐阅读