簡體   English   中英

如何在gorm中處理多個查詢

[英]How to handle multiple queries in gorm

我正在嘗試使用 gorm 處理嵌套查詢,但我很難弄清楚這一點。

查詢:

SELECT smId AS 'slimeId', slStatus, slPPIV, slHighRiskSituation, 
(SELECT count(rnIg) FROM ruins WHERE rnSquidStatus = 'Holding on'
AND rnSmId = smId) AS 'holdingOn',
(SELECT count(rnIg) FROM ruins WHERE rnSquidStatus = 'In system' AND rnSmId = smId)
 AS 'inSystem', smSuspectedCorona,
IF(smStatusClosed != 0, 1, 0) as statusClosed, smSurge, 
(SELECT GROUP_CONCAT(rnName) FROM ruins WHERE rnSquidStatus = 'Holding on' AND rnSmId = smId) 
as 'ruinsOnHold',
(SELECT GROUP_CONCAT(rnName) FROM ruins WHERE rnSquidStatus = 'In system' AND rnSmId = smId)
as 'ruinsInSystem' FROM slimes WHERE slId != 0  GROUP BY slId HAVING slId > 0

所以我可以完成一些非常基礎的工作,問題是當嵌套出現時,我不知道在這種情況下該怎么做

var data []SlimeResponse
db := service.gormdb
db = db.Select("smId as slimeId", "slStatus", "slPPIV", "slHighRiskSituation")
db = db.Where("smId != ?", 0).Group("smId ").Having("smId > ?", 0)
db = db.Table("slimes").Find(&data)

嘗試使用Where方法,但與Joins的工作方式不同,但無法使其工作

您可以使用subQuery

var data []SlimeResponse
db := service.gormdb
subQueryHoldingOn := db.
  Select("count(rnIg)").
  Where("rnSquidStatus = 'In system' AND rnSmId = ?", smId).
  Table("ruins")
subQueryInSystem := db.
  Select("count(rnIg)").
  Where("rnSquidStatus = 'Holding on' AND rnSmId = ?", smId).
  Table("ruins")
groupSubQueryHoldingOn := db.
  Select("GROUP_CONCAT(rnIg)").
  Where("rnSquidStatus = 'In system' AND rnSmId = ?", smId).
  Table("ruins")
groupSubQueryInSystem := db.
  Select("GROUP_CONCAT(rnIg)").
  Where("rnSquidStatus = 'Holding on' AND rnSmId = ?", smId).
  Table("ruins")
db = db.Select("smId as slimeId, slStatus, slPPIV, slHighRiskSituation, (?) as holdingOn, (?) as inSystem, smSuspectedCorona, IF(smStatusClosed != 0, 1, 0) as statusClosed, smSurge, (?) as ruinsOnHold, (?) as ruinsInSystem", subQueryHoldingOn, subQueryInSystem, groupSubQueryHoldingOn, groupSubQueryInSystem)
db = db.Where("smId != ?", 0).Group("smId ").Having("smId > ?", 0)
db = db.Table("slimes").Find(&data)

或者

可以直接在Select中傳入select部分

var data []SlimeResponse
db := service.gormdb
db = db.Select(
  `
    smId AS 'slimeId',
    slStatus,
    slPPIV,
    slHighRiskSituation, 
    (
      SELECT count(rnIg) FROM ruins WHERE rnSquidStatus = 'Holding on' AND rnSmId = ?
    ) AS 'holdingOn',
    (
      SELECT count(rnIg) FROM ruins WHERE rnSquidStatus = 'In system' AND rnSmId = ?
    ) AS 'inSystem',
    smSuspectedCorona,
    IF(smStatusClosed != 0, 1, 0) as statusClosed,
    smSurge, 
    (
      SELECT GROUP_CONCAT(rnName) FROM ruins WHERE rnSquidStatus = 'Holding on' AND rnSmId = ?
    ) as 'ruinsOnHold',
    (
      SELECT GROUP_CONCAT(rnName) FROM ruins WHERE rnSquidStatus = 'In system' AND rnSmId = ?
    ) as 'ruinsInSystem'
  `, smId, smId, smId, smId
)
db = db.Where("smId != ?", 0).Group("smId ").Having("smId > ?", 0)
db = db.Table("slimes").Find(&data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM