MySQL 在标准 SELECT ... GROUP BY 查询中找到字符串/列后缀的共同开头

问题描述 投票:0回答:1

一个有趣的 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 是一个选项。

当然,良好的数据库设计可以防止发生这样的查询。但有时您必须在现有应用程序中添加一些内容,并且不值得为了一个很少使用的小查询而重新设计数据库。向几乎从未使用过的表添加字段会使您的数据库变得混乱,并使事情变得更加混乱......

mysql group-by
1个回答
0
投票

如果模式没有改变,您可以使用

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.