Горм, имеющий запрос с ИЛИ - PullRequest
0 голосов
/ 24 октября 2018

Я застрял в создании запроса, который динамически создается во время выполнения.

Я хочу создать запрос 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 в качестве диалекта

1 Ответ

0 голосов
/ 24 октября 2018

Вывод строки:

    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) `` `

, чтобы получить один илив середине имеющего утверждения, как вы просите:

((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 для этого.

...