首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gorm查询OR

gorm查询OR
EN

Stack Overflow用户
提问于 2018-10-23 22:30:48
回答 1查看 5K关注 0票数 0

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

我想要创建一个having查询,其中OR位于中间。

代码语言:javascript
复制
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))

请注意,我所要求的是OR is having语句。

我和戈姆一起得到了这个:

代码语言:javascript
复制
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))

注意AND语句中的having

这是查询生成:

代码语言:javascript
复制
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作为方言

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-24 04:34:09

该线的输出:

代码语言:javascript
复制
    groupQuery = groupQuery.Having("SUM(group_key = ? AND group_value = ?) > 0", key, val)

是块

代码语言:javascript
复制
((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)和(COND2)和(COND3)和(COND4)‘,以便根据您的请求获得一个单独的或位于request语句中间的语句:

代码语言:javascript
复制

((group_key=‘年龄’和group_value = '20') > 0)

(group_key=‘除法’和group_value =‘会计’> 0))

((group_key=‘年龄’和group_value = '22') > 0)

(group_key=‘除法’和group_value =‘厨房’>0)

代码语言:javascript
复制

这将是:

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

会导致不那么预期的结果。

更合乎逻辑的做法是:

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

或者:

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

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

看起来,对于这一点,您几乎只能使用原始SQL了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52958683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档