2013-09-19 4 views
-1

У меня есть таблица со следующими полями: сезон, коллекция, product_key, aggregated_sale. Следующий запрос не дает ожидаемых результатовmysql orderby on column после groupby

select 
    t.* 
from 
    (SELECT * FROM rank_processing.aggregate_season_product 
     order by aggregated_sale) t 
group by 
    t.collection, 
    t.forecast_name, 
    t.product_key; 

ввод образца

ss, f1, 1, 11 
ss, f1, 3, 10 
ss, f1, 2, 5 
ss, f2, 5, 11 
ss, f2, 4, 7 

ожидаются выход

ss, f1, 2, 5 
ss, f1, 3, 10 
ss, f1, 1, 11 
ss, f2, 4, 7 
ss, f2, 5, 11 
+0

входная выборка сс, f1, 1, 11 сс, f1, 3, 10 сс, f1, 2, 5 сс, f2, 5, 11 сс, f2, 4, 7 ожидается выход сс, f1, 2, 5 сс, f1, 3, 10 сс, f1, 1, 11 сс, f2, 4, 7 ss, f2, 5, 11 – user2450833

+1

Я так смущен. Как это отсортировано? –

+0

Выполнение 'GROUP BY' mysql выполняет сортировку для своих внутренних пупок, поэтому ваш' ORDER BY' во вложенном запросе ничего не меняет – zerkms

ответ

1

Обратите внимание, что без явного сервера ORDER BY условия не требуется, чтобы сортировать результаты, даже если GROUP BY есть.

Если вы хотите заказать ваши результаты, просто добавьте соответствующий ORDER BY, что-то вроде этого:

SELECT t.* 
FROM (SELECT * FROM rank_processing.aggregate_season_product 
    ORDER BY aggregated_sale) t 
GROUP BY 
    t.collection, 
    t.forecast_name, 
    t.product_key 
ORDER BY 
    t.collection, 
    t.forecast_name, 
    t.product_key 

Другой вопрос в том, что ORDER BY внутри подзапроса бесполезно, и вы должны даже расширить этот подзапрос, чтобы устранить его полностью ,

+0

Сортировка во вложенном запросе бессмысленна. – zerkms

+0

@zerkms: вот почему я упомянул, что он должен быть устранен – mvp

+0

Почему бы не показать результат запроса? PS: 'GROUP BY' выполняет внутреннюю сортировку, поэтому' ORDER BY' над одними и теми же столбцами является избыточным. PPS: OP хотел, чтобы результирующий набор сортировался по 'collection, forecast_name, aggregated_sale', а не' collection, forecast_name, product_key' – zerkms

1

Зачем вам нужен подзапрос? Этот запрос должен дать вам результат.

SELECT * FROM rank_processing.aggregate_season_product 
group by 
    collection, 
    forecast_name, 
    product_key 
order by season, collection, aggregated_sale 

Я предполагаю, вы бы даже не нужна настройка GROUP BY

SELECT * FROM rank_processing.aggregate_season_product 
order by season, collection, aggregated_sale 
+0

Использование столбцов, которые не используются в функции GROUP BY или aggregate, приведет к непредсказуемым результатам. – zerkms

+0

он решил мою проблему. Спасибо – user2450833

+0

@ user2450833: предлагаемое решение идеологически неверно – zerkms

0

SQL Fiddle

MySQL 5.5.32 Схема:

CREATE TABLE aggregate_season_product 
    (`season` varchar(2), `collection` varchar(2), `forecast_name` varchar(2), `product_key` int, `aggregated_sale` int) 
; 

INSERT INTO aggregate_season_product 
    (`season`, `collection`, `forecast_name`, `product_key`, `aggregated_sale`) 
VALUES 
    ('ss', 'cc', 'f1', 1, 11), 
    ('ss', 'cc', 'f1', 3, 10), 
    ('ss', 'cc', 'f1', 2, 5), 
    ('ss', 'cc', 'f2', 5, 11), 
    ('ss', 'cc', 'f2', 4, 7) 
; 

запросов 1:

select * 
from aggregate_season_product 
where season = 'ss' and collection = 'cc' 
ORDER by 
    season, 
    collection, 
    forecast_name, 
    aggregated_sale 

Results:

| SEASON | COLLECTION | FORECAST_NAME | PRODUCT_KEY | AGGREGATED_SALE | 
|--------|------------|---------------|-------------|-----------------| 
|  ss |   cc |   f1 |   2 |    5 | 
|  ss |   cc |   f1 |   3 |    10 | 
|  ss |   cc |   f1 |   1 |    11 | 
|  ss |   cc |   f2 |   4 |    7 | 
|  ss |   cc |   f2 |   5 |    11 | 
Смежные вопросы