我被困在生成一个在运行时动态创建的查询。
我想要创建一个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))请注意,我所要求的是OR is 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))
AND
((SUM(group_key = 'age' AND group_value = '22') > 0)
AND
(SUM(group_key = 'division' AND group_value = 'kitchen') > 0))注意AND语句中的having
这是查询生成:
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作为方言
发布于 2018-10-24 04:34:09
该线的输出:
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))这是正确的。请查看每行的所有开头和结尾括号:
(COND1)和(COND2)和(COND3)和(COND4)‘,以便根据您的请求获得一个单独的或位于request语句中间的语句:
((group_key=‘年龄’和group_value = '20') > 0)
和
(group_key=‘除法’和group_value =‘会计’> 0))
和
((group_key=‘年龄’和group_value = '22') > 0)
和
(group_key=‘除法’和group_value =‘厨房’>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了。
https://stackoverflow.com/questions/52958683
复制相似问题