Я застрял в создании запроса, который динамически создается во время выполнения.
Я хочу создать запрос 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
в having
- это то, о чем я спрашиваю.
В настоящее время я получил это с помощью 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))
Обратите внимание на 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.Я не предпочитаю, но если это единственный способ, чем все в порядке.
NB: я использую mysql в качестве диалекта