2

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

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

4

2 回答 2

8
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 小提琴示例

于 2012-08-09T21:36:31.220 回答
0

如果您的表的列是letterand number,那么我将采取的方法如下:

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
于 2012-08-09T21:42:13.590 回答