2015-05-03 5 views
1
SELECT invoice_id, sum_amount 
FROM (SELECT invoice_id, SUM(amount) AS sum_amount 
     FROM invoice 
     GROUP BY invoice_id) AS TEMP_TABLE 
WHERE sum_amount in (SELECT MAX(sum_amount) 
        FROM TEMP_TABLE); 

Когда я попытался использовать TEMP_TABLE, произошла ошибка, и TEMP_TABLE не существует. Почему это не работает? Я думаю, что порядок выполнения «FROM», затем «WHERE», в то время был создан псевдоним таблицы.Как использовать псевдоним таблицы подзапроса в предложении WHERE в MySQL

+0

я знаю, есть и другие способы, чтобы сделать это. но какое-либо объяснение, почему этот недействителен? Благодаря! – niu

+0

Вам понадобится CTE (общее табличное выражение), чтобы повторно использовать производный псевдоним таблицы, а mysql не поддерживает CTE. – piotrm

ответ

2

Вы не можете рассчитать максимальные для ранее вычисленного псевдонима в подзапросе качестве альтернативы вы можете переписать запрос в

SELECT a.invoice_id, SUM(a.amount) AS sum_amount, 
c.max_amount 
FROM invoice AS a 
CROSS JOIN (
     SELECT MAX(sum_amount) max_amount FROM(
      SELECT invoice_id, SUM(amount) AS sum_amount 
      FROM invoice 
      GROUP BY invoice_id 
    ) b 
) c 
GROUP BY a.invoice_id 
HAVING sum_amount = c.max_amount 

Я создал образец дем для целей тестирования

Примеров данных

INSERT INTO invoice 
    (`invoice_id`, `amount`) 
VALUES 
    (1, 10), 
    (2, 5), 
    (2, 5), 
    (3, 1), 
    (4, 2); 

В вышеуказанном запросе вы можете увидеть максимальную сумму суммы для счета-фактуры 10, поэтому invoice_id => 1,2 должен быть возвращен 1 имеет сумму 10 и две записи для invoice_id => 2 (5 + 5 = 10) также 10, 3 и 4 не должны быть включены в результирующий набор выхода образца

invoice_id sum_amount max_amount 
1   10   10 
2   10   10 

DEMO

+0

спасибо. любые ссылки для объяснения того, почему псевдоним нельзя использовать? – niu

+0

@llian Я не могу найти лучшую ссылку для отправки, но псевдоним, вычисленный как псевдоним, можно использовать для фильтра, но не для вычисления, либо вам нужно поставить весь запрос, либо вам нужно использовать подвыборы –

Смежные вопросы