sqlite.swift如何执行子查询
我试图通过查询从消息表中获取特定对话中的最新N条消息。我认为这是正确的sql:sqlite.swift如何执行子查询,sqlite,sqlite.swift,Sqlite,Sqlite.swift,我试图通过查询从消息表中获取特定对话中的最新N条消息。我认为这是正确的sql: select * from (select * from messages where convoId = to order by timestamp DESC limit 10) order by timestamp ASC; 我在sqlite.swift中尝试过这一点: static let table = Table("messages") let query = (table.filter(convoId
select * from
(select * from messages where convoId = to order by timestamp DESC limit 10)
order by timestamp ASC;
我在sqlite.swift中尝试过这一点:
static let table = Table("messages")
let query = (table.filter(convoId == to).order(timestamp.desc).limit(10)).select(table[*]).order(timestamp.asc)
一旦消息量超过限制,它将不起作用。有没有办法查看sqlite.swift查询生成的sql?有什么建议吗
编辑:我也尝试了原始SQL查询,但现在我不确定如何提取结果。我觉得这应该是最后的选择:
let toQuoted = "'" + to + "'"
let subQueryStr: String = [
"(SELECT * FROM",
MessageDataHelper.TABLE_NAME,
"WHERE",
MessageDataHelper.CONVO_ID, "=", toQuoted, "ORDER BY", MessageDataHelper.TIMESTAMP, "DESC LIMIT", String(5), ")"
].joined(separator: " ")
let queryStr: String = [
"SELECT * FROM",
subQueryStr,
["ORDER BY", MessageDataHelper.TIMESTAMP, "ASC;"].joined(separator: " ")
].joined(separator: "\n")
let stmt = try db.prepare(queryStr)
for row in stmt {
// ? how can this be used to create model structure
for (index, name) in stmt.columnNames.enumerate() {
print ("\(name)=\(row[index]!)")
}
}
行[index]是绑定类型,因此我不确定如何检索那里的值。救命啊
谢谢好的,看来子查询可能太复杂,无法在sqllite.swift中表达。我最终使用了原始sql查询。您可以通过如下所述强制转换绑定来检索结果:
如果您曾经梦想过一个Swift SQLite库,该库提供相同的行消耗,那么无论何时使用SQL builder或原始SQL查询,请查看。