Оптимизировать запрос Union в Mysql - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть этот запрос

SELECT 
    ID, isDebit, AccountID, SUM(Amount) AS Amount
FROM
    journaltransactions
WHERE
    AccountID <> 78 and date between '2018-11-29' and '2018-11-29'
    union
    SELECT 
    ID, isDebit, AccountID, SUM(Amount) AS Amount
FROM
    journaltransactions
WHERE
    AccountID <> 795 and date between '2018-11-29' and '2018-11-29'
    union
    SELECT 
    ID, isDebit, AccountID, SUM(Amount) AS Amount
FROM
    journaltransactions
WHERE
    AccountID <> 56 and date between '2018-11-29' and '2018-11-29'
    union
    SELECT 
    ID, isDebit, AccountID, SUM(Amount) AS Amount
FROM
    journaltransactions
WHERE
    AccountID <> 89 and date between '2018-11-29' and '2018-11-29'
    union
    SELECT 
    ID, isDebit, AccountID, SUM(Amount) AS Amount
FROM
    journaltransactions
WHERE
    AccountID <> 90 and date between '2018-11-29' and '2018-11-29'

здесь 78,795,56,89,90 - это набор идентификаторов учетных записей для условия, если количество идентификаторов увеличивается настолько, сколько мне нужно добавить

Кто-нибудь поможет мне оптимизировать этот запрос, чтобы лучше

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Учтите следующее.Я опустил СУММУ, потому что не совсем понятно, что следует суммировать.

SELECT 
    ID, isDebit, AccountID
FROM
    journaltransactions
WHERE
   AccountID NOT IN (78,795,56,89,90) 
   and date = '2018-11-29' 
0 голосов
/ 04 декабря 2018

Вы можете использовать NOT IN

SELECT 
    ID, isDebit, AccountID, SUM(Amount) AS Amount
FROM
    journaltransactions
WHERE
    AccountID NOT IN (78,795,56,89,90) and date between '2018-11-29' and '2018-11-29'

Примечание. Поскольку вы используете SUM в своем SQL, вам нужно использовать GROUP BY, чтобы получить желаемый результат


Для вашего задания попробуйте следующее, в этом случае мы получаем идентификатор из того же самого файла вкладки, а затем используем <>, чтобы получить результат

SELECT 
    a.ID, a.isDebit, a.AccountID, SUM(a.Amount) AS Amount
FROM
    journaltransactions a
    JOIN journaltransactions b ON b.id IN (78,795,56,89,90);
WHERE
    BETWEEN '2018-11-29' AND '2018-11-29'
    AND a.id<>b.id
GROUP BY a.id
...