有 OR 查询的 gorm
gorm having query with OR
我一直在生成一个在 运行 时间内动态创建的查询。
我想创建一个中间带有 OR
的 having
查询,例如
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)
是区块
((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) OR (COND2) OR (COND3) OR COND(4)
或:
((COND1) AND (COND2)) OR ((COND3) AND COND(4))
最后一个版本(这似乎是您的目标)无法按规定在循环中生成,需要特定的方法。
看起来你在这方面几乎只能是原始的 SQL。
我一直在生成一个在 运行 时间内动态创建的查询。
我想创建一个中间带有 OR
的 having
查询,例如
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)
是区块
((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) OR (COND2) OR (COND3) OR COND(4)
或:
((COND1) AND (COND2)) OR ((COND3) AND COND(4))
最后一个版本(这似乎是您的目标)无法按规定在循环中生成,需要特定的方法。
看起来你在这方面几乎只能是原始的 SQL。