Using a subquery in 'FROM' in gorm

后端 未结 6 1452
梦谈多话
梦谈多话 2021-02-10 03:03

I would like to know how I can use a subquery in FROM clause using gorm. It would look like the following:

SELECT * FROM 
(
  SELECT foo.*
  FROM foo
  WHERE bar         


        
相关标签:
6条回答
  • 2021-02-10 03:21

    Solved this issue by creating a package for more flexibility: https://github.com/loeffel-io/sql

    subquery := sql.Create().
        Select(true, "purchases.*").
        Select(true, "...").
        From(true, "purchases").
        Join(true, "transactions ON transactions.purchase_id=purchases.id")
    
    query := sql.Create().Select(true, "*").
        From(true, "(?) purchases", gorm.Expr(subquery.GetSQL(), subquery.GetValues()...)).
        Join(true, "transactions ON transactions.id=purchases.last_transaction_id")
    
    db.
        Raw(query.GetSQL(), query.GetValues()...).
        Offset(...).
        Limit(...).
        Order(...).
        Unscoped().
        Find(&purchases).
        Error
    
    0 讨论(0)
  • 2021-02-10 03:24

    You could use QueryExpr, refer

    http://jinzhu.me/gorm/crud.html#subquery

    db.Where("amount > ?", DB.Table("orders").Select("AVG(amount)").Where("state = ?", "paid").QueryExpr()).Find(&orders)

    Which generate SQL

    SELECT * FROM "orders" WHERE "orders"."deleted_at" IS NULL AND (amount > (SELECT AVG(amount) FROM "orders" WHERE (state = 'paid')));

    0 讨论(0)
  • 2021-02-10 03:36

    FYI – Jinzhu's method doesn't work

    I have subqueries working using this method...

    var somevalue = 1
    row := db.Select("something").Table("first_table").Where("exists(?)", db.Select("a_relationship_to_something").Model(&SecondTable{}).Where("id = ?", somevalue).QueryExpr()).Row()
    var result string
    row.Scan(&result)
    

    I've tested this with row(), rows(), first(), and find(). You can also use both .Table() and .Model() interchangeably as shown in the example.

    0 讨论(0)
  • 2021-02-10 03:38

    also could be used in join

    subQuery:=db.Find(&subTable).QueryExpr()
    
    db.
    Table("table").
    Select("*").
    Join("join (?) as t1 on t1.id==table.id", //<---round brackets for multiple rows
    subQuery).
    Find(&Rows)
    
    
    0 讨论(0)
  • 2021-02-10 03:40

    Author didn't use any "JOIN" in his SQL.

    I didn't find any ORM way, but db.Raw works.

    subQuery := db.
        Select("foo.*").
        Table("foo").
        Where("bar = ?", "baz").
        SubQuery()
    
    db.Raw("SELECT * FROM ? as t1 WHERE t1.id=?", subQuery, 1).Find(&rows)
    
    0 讨论(0)
  • 2021-02-10 03:41

    Also you can do it with join on a subquery

    subQuery := db.
        Select("foo.*").
        Table("foo").
        Where("bar = ?", "baz").
        SubQuery()
    
    db.
        Select("t1.*").
        Join("INNER JOIN ? AS t1 ON t1.id = foo.id", subQuery).
        Where("t1.id = ?", 1)
    
    0 讨论(0)
提交回复
热议问题