首页 > 解决方案 > 查询在 SQLite 中不起作用

问题描述

为什么这在 SQLite 但在 MySQL 中不起作用?如果你能帮助我,那就太好了!

其他问题:我可以用连接替换子选择吗?

SELECT h1.drivers.name, SUM((
    SELECT kilometers FROM history AS h2
    WHERE h2.timestamp >= h1.timestamp
    AND h1.id != h2.id
    GROUP BY h2.timestamp HAVING MIN(h2.timestamp) LIMIT 1
    ) - h1.kilometers) AS driven_kilometers
FROM history AS h1
INNER JOIN drivers ON drivers.id = h1.driver_id
GROUP BY h1.driver_id

为了澄清我的问题:

╔════╦═════════╦═════════════════════╦═══════════════╗
║ id ║driver_id║      timestamp      ║ kilometers    ║
╠════╬═════════╬═════════════════════╬═══════════════╣
║  1 ║    1    ║ 2018-07-01 12:00:04 ║             0 ║
║  2 ║    2    ║ 2018-07-01 16:05:12 ║           120 ║
║  3 ║    1    ║ 2018-07-06 11:13:59 ║           220 ║
║  4 ║    2    ║ 2018-07-09 09:17:19 ║           250 ║
║  5 ║    1    ║ 2018-07-12 10:02:00 ║           300 ║
║  6 ║    2    ║ 2018-07-16 07:11:21 ║           320 ║
╚════╩═════════╩═════════════════════╩═══════════════╝

我想计算行驶公里数。司机在开始驾驶时会添加一个数据集,以便他们插入对方驾驶的公里数。

示例:我要计算的驾驶员 2 的公里数:220-120 + 300-250 = 150

司机 1 的公里数:我要计算:120-0 + 250-220 + 320-300 = 170

标签: sqlitesubquery

解决方案


在子查询中,分组没有意义,因为时间戳无论如何都是唯一的。

要从具有下一个最大时间戳的行中获取值,只需将 ORDER BY 与 LIMIT 一起使用:

SELECT drivers.name,
       SUM((SELECT kilometers
            FROM history AS h2
            WHERE h2.timestamp > h1.timestamp
            ORDER BY h2.timestamp 
            LIMIT 1
           ) - h1.kilometers
          ) AS driven_kilometers
FROM history AS h1
INNER JOIN drivers ON drivers.id = h1.driver_id
GROUP BY h1.driver_id;

推荐阅读