我有一张桌子,就像那张:
| 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
(我需要按总和排序(或仅用作排序参数) ))。我应该创建一个临时表,然后使用下面的解决方案吗?
答案 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
答案 1 :(得分:0)
如果您的表格列为letter
和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