有 OR 查询的 gorm

标签 go go-gorm

我一直在生成一个在运行时动态创建的查询。

我想创建一个 having 查询,中间带有 OR,例如

SELECT name FROM `user_group`  WHERE ((group_key = 'age' AND group_value = '20')) 

OR ((group_key = 'division' AND group_value = 'accounting')) 
OR ((group_key = 'age' AND group_value = '22')) 
OR ((group_key = 'division' AND group_value = 'kitchen'))

GROUP_BY name
HAVING 
((SUM(group_key = 'age' AND group_value = '20') > 0) 
AND 
(SUM(group_key = 'division' AND group_value = 'accounting') > 0))

OR 

((SUM(group_key = 'age' AND group_value = '22') > 0) 
AND 
(SUM(group_key = 'division' AND group_value = 'kitchen') > 0))

请注意,having 语句中的 OR 就是我要问的。

我目前用 gorm 得到了这个:

SELECT name FROM `user_group`  WHERE ((group_key = 'age' AND group_value = '20')) 

OR ((group_key = 'division' AND group_value = 'accounting')) 
OR ((group_key = 'age' AND group_value = '22')) 
OR ((group_key = 'division' AND group_value = 'kitchen'))

GROUP_BY name
HAVING 
((SUM(group_key = 'age' AND group_value = '20') > 0) 
AND 
(SUM(group_key = 'division' AND group_value = 'accounting') > 0))

AND 

((SUM(group_key = 'age' AND group_value = '22') > 0) 
AND 
(SUM(group_key = 'division' AND group_value = 'kitchen') > 0))

注意having语句中的AND

这是查询生成:

for _, condition := range resp.Allow.Conditions {
    for key, val := range condition {
        if len(key) <= 0 || len(val) <= 0 {
            continue
        }
        groupQuery = groupQuery.Or("(group_key = ? AND group_value = ?)", key, val)
        groupQuery = groupQuery.Having("SUM(group_key = ? AND group_value = ?) > 0", key, val)
    }
}
groupQuery = groupQuery.Group('name')

gorm 中有什么方法可以做到这一点吗?我查看了文档,我认为它必须是原始 sql 查询。我不喜欢它,但如果这是唯一的方法,那也没关系。

注意:我正在使用 mysql 作为方言

最佳答案

该行的输出:

    groupQuery = groupQuery.Having("SUM(group_key = ? AND group_value = ?) > 0", key, val)

是方 block

((SUM(group_key = 'age' AND group_value = '20') > 0) 
AND 
(SUM(group_key = 'division' AND group_value = 'accounting') > 0))

AND 

((SUM(group_key = 'age' AND group_value = '22') > 0) 
AND 
(SUM(group_key = 'division' AND group_value = 'kitchen') > 0))

这是正确的。查看每行的所有左括号和右括号:

````(条件 1)和(条件 2)和(条件 3)和(条件 4)```

按照您的要求获取单个或中间的 having 语句:

((SUM(group_key = 'age' AND group_value = '20') > 0) 
AND 
(SUM(group_key = 'division' AND group_value = 'accounting') > 0))

AND 

((SUM(group_key = 'age' AND group_value = '22') > 0) 
AND 
(SUM(group_key = 'division' AND group_value = 'kitchen') > 0))

这将是:

(COND1) AND (COND2) OR (COND3) AND COND(4)

会导致不如预期的结果。

更合乎逻辑的是:

(COND1) 或 (COND2) 或 (COND3) 或 COND(4)

或者:

((COND1) AND (COND2)) 或 ((COND3) AND COND(4))

最后一个版本(这似乎是您的目标)不能像规定的那样在循环中生成,并且需要特定的方法。

看起来您几乎只能使用原始 SQL。

关于有 OR 查询的 gorm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52958683/

相关文章:

Gorm 不创建条目

go - 相当于 json marshal 的 Stringer

google-app-engine -/_ah/start 在 AppEngine 上的 Go 中从未被调用

unit-testing - 如何使用 gomock (或类似的)来模拟/验证对数据库的调用?

go - golang 中的通用处理 CRUD 操作

mysql - 为什么用户类型没有填充mysql表中的数据值?

go - 如何按Gorm中的角色过滤用户?

go - 检查结构的多个属性的更惯用的方法?

go - 我应该为下游服务调用创建一个新上下文还是只是简单地传递上游服务调用?

Go/Golang : how to extract least significant digits from big. float ?