我的表单中有一个表(名为 stock_level
)
product_code | quantity | date
我想创建表单的 View
product_code | date | quantity today - quantity 1 week ago | quantity today - quantity 1 day ago
到目前为止,我的选择是:
SELECT d.product_code, d.date, d.day_change, w.week_change
FROM (SELECT p1.date, p1.product_code, p1.quantity - p2.quantity as day_change
FROM stock_level p1
INNER JOIN stock_level p2
ON p1.product_code = p2.product_code
AND p2.date = p1.date - INTERVAL 1 DAY) d
INNER JOIN
(SELECT p1.date, p1.product_code, p1.quantity - p2.quantity as week_change
FROM stock_level p1
INNER JOIN stock_level p2
ON p1.product_code = p2.product_code
AND p2.date = p1.date - INTERVAL 7 DAY) w
ON d.product_code = w.product_code
AND d.date = w.date
ORDER BY d.date desc
虽然我正在做的事情似乎有效,但感觉效率不高(例如,有 3 个连接,而逻辑上应该需要 2 个连接)
有更好的方法吗?
最佳答案
您可以使用条件聚合来做到这一点:
您应该使用 LEFT JOIN
和过去每一天的单个连接来表达这一点:
SELECT slnow.product_code, slnow.date,
(slnow.quantity - sl1.quantity) as day_change,
(slnow.quantity - sl7.quantity) as week_change
FROM stock_level slnow LEFT JOIN
slock_level sl1
ON slnow.product_code = sl1.product_code AND
sl1.date = slnow.date - interval 1 day LEFT JOIN
stock_level sl7
ON slnow.product_code = sl7.product_code AND
sl7.date = slnow.date - interval 7 day
ORDER BY slnow.date DESC;
此外,MySQL 不允许在 View 的 FROM
子句中使用子查询,因此您的查询不适用于 View 。
关于mysql - 1 天前和 1 周前的行之间的 SQL 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32413382/