2012-04-12 6 views
0

Я пытаюсь сортировать результаты, но мой заказ по выражению игнорируется ... Я понимаю, почему, но не как это исправить. Вот мой код:MYSQL GROUP BY/ORDER BY confusion

SELECT 
    result.station_id as 'Station ID', 
    result.date as 'Date', 
    result.id as 'ID', 
    COALESCE(sum(if(result.parameter = '1', result.result, NULL)),'-') as 'RESULT A)', 
    COALESCE(sum(if(result.parameter = '2', result.result, NULL)),'-') as 'RESULT B)', 
FROM ( 
    SELECT 
     event.station_id, 
     event.date, 
     event.id, 
     e_result.result 
    FROM event 
    Inner Join e_result ON e_result.id = event.id 
    WHERE 
     (event.station_id = '0001') AND `devent`.`date` >= '1999-02-08' AND `event`.`date` <= '2011-12-20') as result 
GROUP BY by result.id 
ORDER BY 
    result.station_id ASC, 
    result.date DESC 

Это правильно группировка, но не сортировать результаты потом ... Вроде бы сортировкой группировки. Мне нужен весь результирующий набор (не каждая группа) отсортированный после группировка закончена

Пример вывода:

Station Date  ID   Result A Result B 
20  7/6/2009 g003  -   3 
12  2/8/1999 g000  19.2  - 
12  2/8/1999 g001  19.9  - 
12  2/14/1999 g002  19.1  - 
17  4/9/2003 i001  22.2  4 

Должно быть

Station Date  ID   Result A Result B 
12  2/14/1999 g002  19.1  - 
12  2/8/1999 g000  19.2  - 
12  2/8/1999 g001  19.9  - 
17  4/9/2003 i001  22.2  4 
20  7/6/2009 g003  -   3 

Таблицы:

e_result id, parameter, result 
    g002, 1, 19.1 
    g000, 1, 19.2 
    g001, 1, 19.9 
    i001, 1, 22.2 
    i001, 2, 4 
    g003, 2, 3 

event  station_id, date, id 
    20, 7/16/2009, g003 
    12, 2/8/1999, g000 
    12, 2/8/1999, g001 
    12, 2/14/1999, g002 
    17, 4/9/2003, i001 
+0

Покажите нам некоторый вывод, что вы чувствуете, неправильно отсортирован. В общем случае предложения 'ORDER BY' будут применяться последними, после того как набор результатов будет сгенерирован, поэтому неясно, что вы спрашиваете. –

+0

@MikeRyan Я думаю, что они хотят, чтобы ORDER BY был завершен до группировки. – Taryn

+0

Это не отвечает на ваш вопрос точно, но может помочь. Использование графических построителей запросов упростило бы создание таких сложных запросов в mysql без ошибок. Взгляните на этот пост на SO - http://stackoverflow.com/questions/2506610/visual-query-builder –

ответ

1

Я поместил ваш запрос в sqlfiddle, но должен был сделать много настроек, чтобы заставить его работать.

Вот запрос, который производит результат, который вы хотите:

select result.station_id as 'Station ID', 
    date_format(result.date,'%c/%m/%Y') as 'Date', 
    result.id as 'ID', 
    if (sum(if(result.parameter = 1, result.result,0)) = 0, 
     null, 
     sum(if(result.parameter = 1, result.result,0))) as 'RESULT A)', 
    if (sum(if(result.parameter = 2, result.result,0)) = 0, 
     null, 
     sum(if(result.parameter = 2, result.result,0))) as 'RESULT B)' 
from 
     (SELECT 
     event.station_id, 
     event.date, 
     event.id, 
     e_result.result, 
     e_result.parameter 
     FROM event 
     Inner join e_result ON e_result.id = event.id) as result 
group by 
    result.station_id, result.date, result.id 
order by 
    result.station_id ASC, 
    result.date DESC; 

Я переработал COALESCE, я извлекал где положение о внутреннем результате таблицы, исправляется «devent» опечатка, добавлено поле параметра в внутренний стол. и несколько других вещей

Это дает:

STATION ID DATE   ID  RESULT A RESULT B 
12   2/02/1999 g002 19.1  
12   2/02/1999 g000 19.2  
12   2/02/1999 g001 19.9  
17   4/04/2003 i001 22.2  4 
20   7/07/2009 g003    3 

Это все здесь: http://sqlfiddle.com/#!2/34d87/17

+0

Спасибо ... извините за опечатки и такие ... это урезанная версия реального запроса, но ваше решение помогло! Еще раз спасибо! –

0

Ваш запрос в порядке, но в конце отсутствует одна последняя функция:

GROUP BY 
result.station_id 
1

Хорошо, я вижу, вы не понимаете, как работает group by. Когда вы группируетесь, вы теряете отдельные записи и складываете их в сумку, что позволяет выполнять совокупные функции, такие как count, sum и т. Д. Итак, как правило, если вы выбираете неагрегированное поле , тогда вы должны поместить его в пункт group by.

В вашем примере вы не используете какую-либо агрегированную функцию, так зачем вам группироваться?

Кроме того, у вас возникли проблемы с типами данных. Ваш station_id в вашем запросе кажется строкой, а на выходе кажется целым. Другой путь происходит с вашими датами. Моя ставка заключается в том, что вы используете поля символов вместо соответствующего типа данных для этих полей, и вы получаете их упорядоченными как поля символов.

+0

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