【问题标题】:Show all grouped results and sort显示所有分组结果并排序
【发布时间】:2012-08-09 21:32:08
【问题描述】:

我有一张桌子,就像那个:

| B | 1 |
| C | 2 |
| B | 2 |
| A | 2 |
| C | 3 |
| A | 2 |

我想获取它,但已排序和分组。也就是说,我希望它按字母分组,但按组的最高和排序。另外,我想显示组内的所有条目:

| C | 3 |
| C | 2 |
| A | 2 |
| A | 2 |
| B | 2 |
| B | 1 |

顺序是这样的,因为 C 有 3 和 2。3+2=5,高于 A 的 2+2=4,而 A 又高于 B 的 2+1=3。

我需要显示所有“分组”的字母,因为我需要显示其他不同的列。

编辑:

感谢您的快速回复。但是,我有胆量进一步询问。

我有这个问题:

SELECT * FROM `ip_log` WHERE `IP` IN
(SELECT `IP` FROM `ip_log` GROUP BY `IP` HAVING COUNT(DISTINCT `uid`) > 1)
GROUP BY `uid` ORDER BY `IP`

上面描述中的字母是ip(我需要它按IP地址分组),数字是timestamp(我需要它按总和排序(或仅用作排序参数))。我应该创建一个临时表,然后使用下面的解决方案吗?

【问题讨论】:

  • 您能否阐明您的回答后说明的“按总和排序”是什么意思?什么总和?
  • 按单个组的时间戳值之和排序,就像字母按一组字母对应的数字之和排序。
  • 如果列是时间戳,我不确定 SUM 聚合函数的行为,所以我不太了解
  • 没关系,我已经设法通过将它保存到临时表中然后应用redfilter的方法来解决这个问题。

标签: mysql sorting group-by distinct


【解决方案1】:
select t.Letter, t.Value
from MyTable t
inner join (
    select Letter, sum(Value) as ValueSum
    from MyTable
    group by Letter
) ts on t.Letter = ts.Letter
order by ts.ValueSum desc, t.Letter, t.Value desc

SQL Fiddle Example

【讨论】:

    【解决方案2】:

    如果您的表的列是letternumber,我会这样做的方式如下:

    SELECT
        letter,
        GROUP_CONCAT(number ORDER BY number DESC),
        SUM(number) AS total
    FROM table
    GROUP BY letter
    ORDER BY total desc
    

    根据您的示例,您将获得以下内容:

    | C | 3,2 | 5
    | A | 2,2 | 4
    | B | 2,1 | 3
    

    然后您可以处理该数据以获得您想要/需要的实际信息。

    如果您仍需要原始请求格式的数据,则无法使用单个查询。原因是您无法根据未在同一查询中计算的聚合数据(number 列的 SUM)进行排序。因此,您需要创建一个子查询来计算并将其反馈到原始查询中(免责声明:未经测试的查询):

    SELECT
        letter,
        number
    FROM table
         JOIN (SELECT ltr, SUM(number) AS total FROM table GROUP BY letter) AS totals
              ON table.letter = totals.ltr
    ORDER BY totals.total desc, letter desc, number desc
    

    【讨论】:

      猜你喜欢
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      相关资源
      最近更新 更多