mysql - 选择完整字符串时按子字符串分组
问题描述
假设我的 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。因此,如果每个名称存在,它将是唯一的。
解决方案
一种简洁的方法,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 数据。需要具有上述复杂性的查询只是为了获得基本计数可能表明是时候进行设计更改了。
推荐阅读
- c++ - 在字符串中找到特定字符后,如何创建一个插入字符的循环?
- javascript - 类型错误:res 不是函数
- datatable - 如何根据数据表中的值更改单元格颜色
- git - git pull origin master 没有按预期工作
- php - 如何从foreach中的两个数组中获取对应的键值
- python - 如何使用 .bat 文件每 5 分钟关闭并重新运行 python exe
- java - 我怎样才能重复一个模式?
- scala - spark(with scala)中reduceByKey的意外行为?spark或scala中的“rev”保留字?
- python - 当在 OptionMenu 上选择一个选项并按下一个按钮然后为该特定选项发生某些事情时,我该如何做到这一点
- php - 为什么即使 php 版本正确,我也不能在 ssh 上运行 composer install?