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')"

最初の3つのエントリの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データベースからエントリを選択するときに、最新のエントリ(この場合は3番目のエントリ)が選択されるようにオプションを追加するにはどうすればよいですか?

最後に、特定の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''12/26/2012 2:52:20 PM'が最小値と最大値として取得されます。これは、文字列として比較されている場合にのみ意味があります。データをISO8601形式に切り替えて、次のようにします。

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

そして物事は適切にソートされます。

これを修正したら、ORDER BYとLIMITを使用して、1つのレコードだけを剥がすことができます。

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 に答える