【问题标题】:MYSQL GROUP BY / ORDER BY confusionMYSQL GROUP BY / ORDER BY 混淆
【发布时间】:2012-04-12 14:59:12
【问题描述】:

我正在尝试对结果进行排序,但我的语句顺序被忽略了...我明白为什么但不知道如何解决它。这是我的代码:

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

【问题讨论】:

  • 向我们展示一些您认为排序不正确的输出。一般来说,ORDER BY 子句将在生成结果集之后最后应用,所以不清楚你在问什么。
  • @MikeRyan 我认为他们希望在分组之前完成 ORDER BY
  • 这并不能完全回答您的问题,但可能会有所帮助 - 使用图形查询构建器可以很容易地在 mysql 中构建这样复杂的查询而不会出错。看看这篇关于 SO - stackoverflow.com/questions/2506610/visual-query-builder 的帖子
  • @bluefeet 好吧,这可能是 OP 认为 他们想要的。但是在应用GROUP BY 之前排序如何完成任何事情呢?它仍然会根据分组条件组合行。因此,我们需要看到一些输出——我怀疑真正的问题是混淆了 GROUP BY 的真正含义。
  • @KatherineC 可以为此创建一个sqlfiddle 吗?只需足够的数据即可看到效果。他们有 mysql 作为数据库选项。或者编辑您的问题以添加原始表的架构和足够的测试数据来查看效果。

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


【解决方案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;

我重新设计了合并,删除了内表结果上的 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】:

好吧,我看得出来你不明白group by 的工作原理。当您分组时,您会丢失单个记录并将它们放在一个包中,这样您就可以执行聚合功能,例如countsum 等。因此,根据经验,如果您选择一个非聚合字段,那么你应该把它放在group by 子句中。

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

此外,您还遇到了数据类型方面的问题。您的查询中的 station_id 似乎是一个字符串,而输出中的似乎是一个整数。反过来,你的约会也会发生。我敢打赌,您正在使用字符字段而不是这些字段的适当数据类型,并且您将它们作为字符字段排序。

【讨论】:

  • group by 按预期对事件结果进行分组。是的,数据类型不正确……我既没有设置也无法更改。
【解决方案3】:

您的查询很好,但最后缺少最后一个功能:

GROUP BY
 result.station_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2021-02-22
    • 2011-07-18
    相关资源
    最近更新 更多