Запрос всегда возвращает одну пустую строку? - PullRequest
1 голос
/ 23 января 2012

Этот запрос всегда возвращает хотя бы одну строку, даже если ни одна из них не найдена

(
    SELECT accounting.time, enclosure.enc_id_, enclosure.txt, accounting.amount AS sum, SUM(ROUND(vatcode.percent/(100+vatcode.percent)*accounting.amount)) AS sum_vat
    FROM accounting
    INNER JOIN enclosure ON enclosure.id=accounting.enc_id
    LEFT JOIN vatcode ON vatcode.id=accounting.vatcode_id
    WHERE accounting.account_id='10'
)
UNION (
    SELECT accounting.time, enclosure.enc_id_, enclosure.txt, accounting.amount*-1 AS sum, NULL AS sum_vat
    FROM accounting
    INNER JOIN enclosure ON enclosure.id=accounting.enc_id
    WHERE accounting.accountoff_id='10'
) ORDER BY time

Я знаю, что ошибка возникает во втором случае, выберите здесь ... , NULL AS sum_vat .. Если я удалю ее, я получу сообщение об ошибкене имея одинаковые утверждения в обоих выберите?Как это можно решить?

возврат

Array
(
    [time] => 0
    [enc_id_] => 0
    [txt] => 
    [sum] => 0
    [sum_vat] => 
)

1 Ответ

3 голосов
/ 23 января 2012

Если вы используете агрегат без группировки по, агрегат будет проходить по всей таблице, всегда возвращая одну строку. Например,

select max(price) from items where group = 'Servers'

возвращает одну строку с самой высокой ценой. MySQL является единственной базой данных, которая допускает другие столбцы без group by:

select name, max(price) from items where group = 'Servers'

Но, как ни странно, он просто поместил бы случайное значение в столбце имени; имя здесь не будет именем самого дорогого сервера.

В вашем случае очевидным решением является добавление group by к первой части объединения:

SELECT accounting.time, enclosure.enc_id_, enclosure.txt, accounting.amount sum, 
    SUM(ROUND(vatcode.percent/(100+vatcode.percent)*accounting.amount)) sum_vat
FROM accounting
INNER JOIN enclosure ON enclosure.id=accounting.enc_id
LEFT JOIN vatcode ON vatcode.id=accounting.vatcode_id
WHERE accounting.account_id='10'
GROUP BY accounting.time, enclosure.enc_id_, enclosure.txt, accounting.amount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...