我想知道如何使用gorm在FROM子句中使用子查询。如下所示:
SELECT * FROM
(
SELECT foo.*
FROM foo
WHERE bar = "baz"
) AS t1
WHERE t1.id = 1;
我使用golang构建了子查询:
db.Model(Foo{}).Where("bar = ?", "baz")
但是如何在FROM
中使用它作为子查询呢?
如果有一个方法可以将gorm查询转换为SQL字符串,那么我可以简单地将该字符串插入原始SQL。但似乎没有这样的方法。有什么建议吗?
7条答案
按热度按时间tnkciper1#
您也可以在子查询上使用join来执行
mctunoxg2#
您可以使用
QueryExpr
,参考https://gorm.io/docs/advanced_query.html#SubQuery
db.Where(“amount >?“,DB.Table(“orders”).Select(“AVG(amount)”).Where(“state =?“,“paid”).QueryExpr()).Find(&orders)
生成SQL
SELECT * FROM“orders”WHERE“orders”.“deleted_at”IS NULL AND(amount >(SELECT AVG(amount)FROM“orders”WHERE(state = 'paid')));
btxsgosb3#
作者在SQL中没有使用任何“JOIN”。
我没有找到任何ORM方法,但
db.Raw
工作。uelo1irk4#
仅供参考-金珠的方法行不通
我有使用此方法的子查询...
我已经用
row()
、rows()
、first()
和find()
测试了这个问题。您也可以互换使用.Table()
和.Model()
,如示例所示。qvtsj1bj5#
也可用于连接
cu6pst1q6#
而我使用“db.select(“”).Joins(“?“,subQuery)”来查询,我得到了“select * from ``(subquery)”,这是一个错误的SQL。我应该使用'db.Select(“”).Table(““).Joins(“?“,subQuery)'。
htzpubme7#
通过创建一个包以获得更大的灵活性来解决此问题:https://github.com/loeffel-io/sql