MYSQL GROUP BY / ORDER BY混乱

时间:2012-04-12 14:59:13

标签: mysql sql group-by sql-order-by

我正在尝试对结果进行排序,但我的订单却被忽略了...我理解为什么,但不知道如何修复它。这是我的代码:

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

3 个答案:

答案 0 :(得分:1)

好吧,我可以看到你不明白group by是如何运作的。分组时,您会丢失单个记录并将它们放在一个包中,这样您就可以执行聚合功能,例如countsum等。因此,根据经验,如果如果您选择的是非聚合字段,则应将其放在group by子句中。

在你的例子中,你没有使用任何聚合函数,为什么要分组?

此外,您遇到了数据类型问题。查询中的station_id似乎是一个字符串,而输出中似乎是一个整数。另一种方式是你的约会。我敢打赌,你正在使用字符字段而不是那些字段的相应数据类型,并且你将它们作为字符字段进行排序。

答案 1 :(得分: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,我删除了内部表结果中的where子句,更正了'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

答案 2 :(得分:0)

您的查询没问题,但最后遗漏了最后一个函数:

GROUP BY
 result.station_id