Двойная сортировка вложенного запроса в MySQL

Я использую простой запрос sql следующим образом: $sql="SELECT name, DATE_FORMAT(date_add,'%d-%m-%Y') as mydate, payment FROM atable"и я получаю таблицу из 3 столбцов, например:

name  mydate     payment
luke  10-12-2015  50
tom   13-12-2015  60
john  13-12-2015  40
tom   14-12-2015  30
eva   15-12-2015  40
john  16-12-2015  70
tom   16-12-2015  20

Можно ли написать sql-запрос (я думаю, может быть, как-то вложенным), например, чтобы сначала я получил сумму платежей каждой группы по имени, а затем отсортировал ее DESC по сумме, но итоговая таблица была бы такой:

name  mydate     payment
john  13-12-2015  40
john  16-12-2015  70
tom   13-12-2015  60
tom   14-12-2015  30
tom   16-12-2015  20
luke  10-12-2015  50
eva   15-12-2015  40

Джон первый, потому что его сумма платежей равна 110, такая же, как и у Тома, но он первый в алфавитном порядке, затем Люк и Ева последними. Как будет выглядеть запрос (если возможно сделать все шаги в одном sql-запросе)?


person soonic    schedule 04.01.2016    source источник


Ответы (2)


Вот способ: SQL Fiddle

Настройка схемы MySQL 5.6:

CREATE TABLE atable
    (`name` varchar(4), `mydate` datetime, `payment` int)
;

INSERT INTO atable
    (`name`, `mydate`, `payment`)
VALUES
    ('luke', '2015-12-10 00:00:00', 50),
    ('tom', '2015-12-13 00:00:00', 60),
    ('john', '2015-12-13 00:00:00', 40),
    ('tom', '2015-12-14 00:00:00', 30),
    ('eva', '2015-12-15 00:00:00', 40),
    ('john', '2015-12-16 00:00:00', 70),
    ('tom', '2015-12-16 00:00:00', 20)
;

Запрос 1:

select
      atable.name
    , atable.mydate
    , atable.payment
    , g.sum_payment
from atable
inner join (
            select name, sum(payment) as sum_payment
            from atable
            group by name
           ) g on atable.name = g.name
order by
      g.sum_payment DESC
    , atable.name
    , atable.mydate
    , atable.payment

Результаты:

| name |                     mydate | payment | sum_payment |
|------|----------------------------|---------|-------------|
| john | December, 13 2015 00:00:00 |      40 |         110 |
| john | December, 16 2015 00:00:00 |      70 |         110 |
|  tom | December, 13 2015 00:00:00 |      60 |         110 |
|  tom | December, 14 2015 00:00:00 |      30 |         110 |
|  tom | December, 16 2015 00:00:00 |      20 |         110 |
| luke | December, 10 2015 00:00:00 |      50 |          50 |
|  eva | December, 15 2015 00:00:00 |      40 |          40 |
person Paul Maxwell    schedule 04.01.2016

$sql="SELECT name, DATE_FORMAT(date_add,'%d-%m-%Y') as mydate, sum(payment) as total FROM atable group by name order by total DESC"

нам нужно суммировать и группировать согласно вашему требованию.

person Naveed Ramzan    schedule 04.01.2016