mysql - 1 天前和 1 周前的行之间的 SQL 差异

标签 mysql sql join

我的表单中有一个表(名为 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/

相关文章:

mysql - rewritebatchedStatements 在 MySQL 内部做什么?

sql - 复杂的SQL查询

hibernate 标准 API : Joining tables with custom join

apache-spark - Spark : RDD Left Outer Join Optimization for Duplicate Keys

mysql - 在 mysql inner join 中使用星号 (*)?

mysql - 根据现有表的条件创建新列

mysql - 使用 float mysql

php - 查询生成器调用非对象上的成员函数 createQueryBuilder()

sql - 为什么 AVG() 没有给出结果?

python - 通过SimpleHTTPServer调用python脚本将数据插入MYSQL数据库