【问题标题】:Select/ Updated last inputted sql row选择/更新最后输入的 sql 行
【发布时间】:2020-01-25 12:12:34
【问题描述】:

我觉得这是一个非常简单的问题,但我已经尝试使用 sqlite3 解决这个问题好几个小时了。

我只需要检索输入到表中的最后一行数据并用一个值更新它。

我试过c.execute("select max(timestamp) from sensor_data"),它只会返回最近的时间戳。

下面的代码是我的表名和列。

sensor_data(ph, air_temp, water_temp, humidity, water_level, timestamp)

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    您需要SELECT 具有最大timestamp 的行,您可以使用此查询:

    SELECT *
    FROM sensor_data
    WHERE timestamp = (SELECT MAX(timestamp) FROM sensor_data)
    

    或者更简单

    SELECT *
    FROM sensor_data
    ORDER BY timestamp DESC 
    LIMIT 1
    

    要更新此行,请使用类似

    UPDATE sensor_data
    SET air_temp = 20
    WHERE timestamp = (SELECT MAX(timestamp) FROM sensor_data)
    

    【讨论】:

    • 或者SELECT * FROM demo order by id desc limit 1;,但是主要思想已经被击中了。
    • @domino 确实;我已经在答案中添加了这种可能性,尽管它并没有为UPDATE 查询节省太多,因为无论表是否被正确索引,它都需要一个子查询,一个应该和另一个一样快。
    • hmm,当我尝试“c.execute("select * from sensor_data where timestamp = (select max(timestamp) from sensor_data")”来选择和 c.execute("UPDATE sensor_data SET water_temp = 20 WHERE timestamp = (SELECT MAX(timestamp) FROM sensor_data") 更新我不断收到不完整的输入错误?
    • @MikeSandstrom 您缺少应该是子查询的右括号:c.execute("select * from sensor_data where timestamp = (select max(timestamp) from sensor_data)")c.execute("UPDATE sensor_data SET water_temp = 20 WHERE timestamp = (SELECT MAX(timestamp) FROM sensor_data)")
    • @Nick 漂亮,谢谢你。我是 sql 新手,谢谢。我向自己保证我会在睡前完成这个,所以你帮我睡了!
    【解决方案2】:

    您可以使用:从文档中引用 https://www.sqlite.org/lang_corefunc.html#last_insert_rowid

    SELECT last_insert_rowid()
    

    【讨论】:

    • 这是我表中的所有内容 "[(None, None, 8.05, None, None, None), (8.05, 71.6, None, 45.3, 337, '2020-01-24 16:07 :43')]"。当我运行您的建议 ""c.execute('select last_insert_rowid()')"" 时,我收到 ""[(0,)]"" 作为输出。我需要整行。
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 2023-03-27
    • 2011-02-21
    • 1970-01-01
    • 2013-10-15
    • 2021-01-04
    • 1970-01-01
    相关资源
    最近更新 更多