首页 文章

如何以SELECT * FROM(<subquery>)ORDER BY列的形式构造子查询;?

提问于
浏览
1

我正在使用gorm与postgres数据库进行交互 . 我正在尝试通过使用DISTINCT ON和this question文档的查询进行ORDER BY,如何做到这一点并不容易 . 所以我需要以一种形式结束查询

SELECT * FROM (<subquery>) ORDER BY column;

乍一看,我似乎需要使用 db.QueryExpr() 将我的查询转换为表达式并围绕它构建另一个查询 . 然而,似乎gorm没有一种直接指定FROM子句的简单方法 . 我尝试使用 db.Model(expr)db.Table(fmt.Sprint(expr)) ,但模型似乎完全被忽略, fmt.Sprint(expr) 并没有完全按照我的想法返回 . 表达式包含一些私有变量 . 如果我可以将原始查询转换为完全解析的字符串,那么我可以使用 db.Table(query) 但我不确定是否可以在不运行它的情况下将查询生成为字符串 .

如果我有一个完全构建的gorm查询,我如何将它包装在另一个查询中以执行我正在尝试的ORDER BY?

1 回答

  • 0

    如果要编写将要执行的原始SQL(包括具有SQL子查询的SQL)并使用gorm将结果添加到对象,可以使用 .Raw().Scan() 方法:

    query := `
        SELECT sub.*
        FROM (<subquery>) sub
        ORDER BY sub.column;`
    db.Raw(query).Scan(&result)
    

    您将对象的指针引用传递给 .Scan() ,其结构类似于生成的行,与您使用 .First() 的方式非常相似 . .Raw() 也可以在查询中使用 ? 将数据添加到查询中,并将值作为逗号分隔的输入添加到函数中:

    query := `
        SELECT sub.*
        FROM (<subquery>) sub
        WHERE
            sub.column1 = ?
            AND sub.column2 = ?
        ORDER BY sub.column;`
    db.Raw(query, val1, val2).Scan(&result)
    

    有关如何使用SQL构建器的更多信息, .Raw().Scan() 请查看文档中的示例:http://gorm.io/advanced.html#sql-builder

相关问题