Ошибка при выполнении запроса

Рейтинг: 1Ответов: 2Опубликовано: 04.12.2014

Есть запрос:

SELECT lichniy_nomer, MAX(`sum`) FROM (
SELECT  lichniy_nomer, SUM(narushenie.shtraf)'sum' FROM protocol, narushenie
WHERE protocol.nomer_narusheniya=narushenie.nomer_narusheniya
GROUP BY (lichniy_nomer))t1
HAVING  MAX(`sum`) = (SELECT lichniy_nomer FROM (SELECT lichniy_nomer, MAX(`sum`) FROM (
SELECT  lichniy_nomer, SUM(narushenie.shtraf)'sum' FROM protocol, narushenie
WHERE protocol.nomer_narusheniya=narushenie.nomer_narusheniya
GROUP BY (lichniy_nomer))t1))

По задумке, данный запрос должен возвращать личный номер (исходя из максимальной суммы). Однако появляется ошибка:

#1248 - Every derived table must have its own alias.

Как исправить, не могу понять.

Ответы

▲ 4

Да, @smackmychi прав, такие монструозные конструкции тут ни к чему.

select sum(n.shtraf) `sum`, p.lichniy_nomer
from protocol p 
  join narushenie n on n.nomer_narusheniya = p.nomer_narusheniya
group by p.lichniy_nomer
order by `sum` desc
limit 1

Или если хочется с вложениями:

select s.`sum`, p.lichniy_nomer
from protocol p 
  join (select nomer_narusheniya, sum(shtraf) `sum`
        from narushenie
        group by nomer_narusheniya
        order by `sum` desc
        limit 1) s
  on s.nomer_narusheniya = p.nomer_narusheniya

ЗЫ Ошибка #1248 говорит, что все подзапросы должны иметь псевдонимы... что логично и аккуратно.

▲ 1

Для примера. Запрос:
SELECT id, sum(amount) FROM table group by ID order by 2 desc limit 1;
Вернет одну запись (limit 1) - идентификатор и сумму. Данная выборка сгруппирована по ID (group by ID) и отсортирована(order by) по убыванию (desc) второго столбца (order by 2), поэтому первая запись будет иметь максимальное значение суммы и соответствующий идентификатор. Практического опыта у меня в данной области нет, можно подождать ответа от кого-нибудь еще.