首页 > 解决方案 > 选择完整字符串时按子字符串分组

问题描述

假设我的 sql 数据集看起来像这样,它有一列:

John          
John,2345    
Joe,1234      
Joe
Joe,1234
John
John,2345
John,2345
Smith
Smith

我将计算 Joe、John 和 Smith 出现的次数,并仅按他们的名字的子字符串对它们进行分组。我知道我可以选择它作为子字符串,但这不适用于我的情况,因为它显示的是子字符串版本,而不是完整的字符串版本。我希望作为输出的查询结果是:

("John,2345",5)
("Joe,1234",3)
("Smith",2)

所以因为 John 和 Joe 有逗号,我们需要选择整个字符串,如果他们没有像 Smith 这样的逗号,我们只显示只是名称的子字符串。请注意,逗号后面的数字是此人的 ID。因此,如果每个名称存在,它将是唯一的。

标签: mysqlsql

解决方案


一种简洁的方法,SUBSTRING_INDEX用于隔离每条记录中的基本名称:

SELECT
    CONCAT('("', MAX(name), '",', COUNT(*), ')') AS output
FROM
(
    SELECT name, SUBSTRING_INDEX(name, ',', 1) AS name_only
    FROM yourTable
) t
GROUP BY name_only;

下面演示链接的屏幕截图

演示

子查询首先为每个输入名称生成一个名称,它是名称中逗号前面的部分(如果存在逗号)。然后,我们仅按此名称聚合,但为每个名称组选择名称的最大值,以报告您要查看的全名。

请注意,如上所述,您的表设计不是最优的,因为它存储的是 CSV 数据。需要具有上述复杂性的查询只是为了获得基本计数可能表明是时候进行设计更改了。


推荐阅读