一个有趣的 MySQL 小谜题!
给定数据集
id | 描述 | 金额 | 类别 |
---|---|---|---|
1 | 食物#1 | 1 | 1 |
2 | 非食品#2 bla | 3 | 2 |
3 | 食物香蕉 | 5 | 1 |
4 | 非食品#2 foo | 1 | 2 |
5 | 非食品#2 foo bar | 3 | 2 |
如何轻松地将其按类别分组为:
描述 | 总金额 | 类别 |
---|---|---|
食物 | 6 | 1 |
非食品#2 | 7 | 2 |
因此
SELECT COMMON_SUFFIX(Description) AS Description, SUM(Amount) AS TotalAmount, Category FROM table GROUP BY Category
如何实现虚拟聚合(GROUP BY)功能
COMMON_SUFFIX
?
我尝试使用 GROUP_CONCATenating 由唯一分隔符分隔的描述,并使用 REGEXP 查找公共后缀,如果 MySQL 不支持搜索字符串中的反向引用(它适用于支持它们的其他语言),这将起作用。
还有其他想法吗?
需要明确的是,我需要所有 GROUPED BY 记录共有的第一个单词(无论有多少个)。数据集很小,因此如果需要,GROUP_CONCAT 是一个选项。
当然,良好的数据库设计可以防止发生这样的查询。但有时您必须在现有应用程序中添加一些内容,并且不值得为了一个很少使用的小查询而重新设计数据库。向几乎从未使用过的表添加字段会使您的数据库变得混乱,并使事情变得更加混乱......
如果模式没有改变,您可以使用
SUBSTRONG_INDEX
CREATE TABLE tab (
`id` INTEGER,
`Description` VARCHAR(12),
`Amount` INTEGER,
`Category` INTEGER
);
INSERT INTO tab
(`id`, `Description`, `Amount`, `Category`)
VALUES
('1', 'Food #1', '1', '1'),
('2', 'Non-food bla', '3', '2'),
('3', 'Food banana', '5', '1'),
('4', 'Non-food foo', '1', '2'),
('5', 'Non-food bar', '3', '2');
Records: 5 Duplicates: 0 Warnings: 0
SELECT SUBSTRING_INDEX(`Description`,' ',1)
, SUM(`Amount`)
FROM tab
GROUP BY 1
SUBSTRING_INDEX(`描述`,' ',1) | SUM(`金额`) |
---|---|
食物 | 6 |
非食品 | 7 |