我有一个使用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行代码?
其次,当我从Problems数据库中选择一个条目时,如何添加一个选项以便选择最近的条目(在本例中为第三个条目)?
最后,我如何选择某个ID的所有条目(这里我只有int 1,但实际上还有很多其他条目),这样我就可以将它们输出为字符串/写入文件,等。
我找到了有关最近入选的问题的答案,但它们看起来相当复杂。 ORDER BY会以某种方式工作吗?
感谢您的帮助。
答案 0 :(得分:0)
首先,我认为您有数据格式问题。我不认为SQLite会将'12/26/2012 2:52:18 PM'
理解为时间戳,因此您最终会将时间戳作为字符串进行比较。例如,如果我将'12/26/2012 2:52:20 AM'
添加到混音中,我会将'12/26/2012 2:52:18 PM'
和'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