显示所有分组结果并排序

时间:2012-08-09 21:32:09

标签: mysql sorting group-by distinct

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

| 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,对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(我需要按总和排序(或仅用作排序参数) ))。我应该创建一个临时表,然后使用下面的解决方案吗?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

如果您的表格列为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