sqlite.swift如何执行子查询

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

我试图通过查询从消息表中获取特定对话中的最新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 == 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查询,请查看。