0

我有一个使用 SQLite 以下列方式在 Ruby 中构建的数据库:

db.execute "CREATE TABLE IF NOT EXISTS Problems(ID INTEGER, stem BLOB NOT NULL, answer BLOB, datetime TEXT, lastmodifiedby TEXT, primary key (ID, datetime) )"
db.execute "INSERT INTO Problems VALUES(1, 'stem', 'answer', '12/26/2012 2:52:18 PM', 'bob')"
db.execute "INSERT INTO Problems VALUES(1, 'stem modified', 'answer', '12/26/2012 2:52:19 PM', 'bob')"
db.execute "INSERT INTO Problems VALUES(1, 'stem modified further', 'answer', '12/26/2012 2:52:20 PM', 'bob')"

前三个条目的 ID 相同,但时间不同。我目前正在使用以下代码来提取单个条目:

db = SQLite3::Database.new "#{dbname}"
stm = db.prepare "SELECT * FROM Problems WHERE ID=?"
stm.bind_param 1, id
rs = stm.execute  
problem = rs.next    

我的第一个问题 - 有没有办法压缩最后 4 行代码?

其次,当我从问题数据库中选择一个条目时,我将如何添加一个选项以便选择最近的条目(在本例中为第三个)?

最后,我如何选择某个 ID 的所有条目(这里我只有 int 1,但实际上还有很多其他条目),以便我可以将它们作为字符串输出/写入文件等。

我找到了有关最近条目选择的问题的答案,但它们似乎相当复杂。ORDER BY 会以某种方式起作用吗?

谢谢您的帮助。

4

1 回答 1

0

首先,我认为您有数据格式问题。我认为 SQLite 不会理解'12/26/2012 2:52:18 PM'为时间戳,因此您最终会将时间戳作为字符串进行比较。例如,如果我添加'12/26/2012 2:52:20 AM'到组合中,我会得到'12/26/2012 2:52:18 PM'and'12/26/2012 2:52:20 PM'作为最低和最高值,并且只有将它们作为字符串进行比较时才有意义。将您的数据转换为ISO 8601格式,以便您拥有这些:

2012-12-26 14:52:18
2012-12-26 14:52:19
2012-12-26 14:52:20

事情会正确排序。

修复后,您可以使用 ORDER BY 和 LIMIT 仅剥离一条记录:

stm     = db.prepare('select * from Problems where ID = ? order by datetime desc limit 1')
rs      = stm.execute(1)
problem = rs.next    
于 2012-12-27T20:05:47.007 回答