Mysql:无论数字的位置如何,都对数字进行分组

Posted

技术标签:

【中文标题】Mysql:无论数字的位置如何,都对数字进行分组【英文标题】:Mysql: grouping digit regardless of the digit's position 【发布时间】:2021-06-21 01:09:47 【问题描述】:

这听起来有点令人困惑,我不知道如何用语言来表达,但我很难找到解决这个问题的方法。

我想对行进行“分组”,并使用具有相同数字的“数字”列在表格中对它们进行计数,而不管数字的位置如何。

示例:

这是桌子

Id Name Digit
1 name1 123
2 name2 213
3 name3 132
4 name4 122
5 name5 456

答案是:使用 count()

Name Digit Count
name1 123 3
name4 122 1
name5 456 1

其他细节:

数字列是数字 长度固定(3) “名称”列显示必须是组中的任何一个(可以是名称 1、名称 2 或名称 3)

cpanel的mysql版本是82。

【问题讨论】:

为什么要删除previous question? cpanel 的 mysql 版本是 82。 不存在这样的版本。执行SELECT VERSION();并提供完整的输出。 我建议在写出每条记录时存储每个Digit 值的排序版本。从更容易处理的应用程序层执行此操作。从 MySQL 中使用它会相当难看(而且性能不佳)。 值中是否存在零 0?它可能(正式)领先吗? 1+2+3 = 2+1+3=3+2+1 等 = 6 总是3位数吗? 【参考方案1】:

您可以将Digit 列的单个数字视为 3D 空间中的坐标。如果坐标被交换,则结果向量将具有相同的长度。你可以使用这个属性来创建一个高效的查询:

SELECT Name, Digit, COUNT(*) as C
FROM t
GROUP BY(
    POW(CAST(SUBSTRING(digit, 1, 1) AS UNSIGNED),2) +   -- first digit
    POW(CAST(SUBSTRING(digit, 2, 1) AS UNSIGNED),2) +   -- second digit
    POW(CAST(SUBSTRING(digit, 3, 1) AS UNSIGNED),2)     -- third digit
);

我不计算平方根,因为我们对确切的长度不感兴趣。我将列命名为c 而不是count,因为COUNT 是SQL 中的保留字。

【讨论】:

非常感谢您的回答先生...对于我对 sql 的熟悉程度来说,这非常容易理解和简单 没问题...我是来帮忙的。【参考方案2】:
WITH 
parsed AS ( SELECT id, name, Digit DIV 100 val FROM test
            UNION ALL
            SELECT id, name, Digit MOD 100 DIV 10 FROM test
            UNION ALL
            SELECT id, name, Digit MOD 10 FROM test ),
sorted AS ( SELECT id, name, GROUP_CONCAT(val ORDER BY val SEPARATOR '') Digit
            FROM parsed
            GROUP BY id, name )
SELECT MIN(name) Name, Digit, COUNT(*) `Count`
FROM sorted
GROUP BY Digit

【讨论】:

【参考方案3】:
drop table if exists t;
create table t(id int,name varchar(20),digit int);
insert into t values
(1, 'name1',    123),
(2, 'name2',    213),
(3, 'name3',    132),
(4, 'name4',    122),
(5, 'name5',    456),
(6, 'name5',    77),
(7, 'name5',    1),
(8, 'name5',    1);

    with cte as
    (
    select distinct substring(digit,1,1) + substring(digit,2,1) + substring(digit,3,1) digit from t
    )
    select min(id) id,min(name) name,min(t.digit) digit,count(*) cnt
    from   cte
    join   t on   substring(t.digit,1,1) + substring(t.digit,2,1) + substring(t.digit,3,1) = cte.digit
    group  by cte.digit;

+------+-------+-------+-----+
| id   | name  | digit | cnt |
+------+-------+-------+-----+
|    7 | name5 |     1 |   2 |
|    4 | name4 |   122 |   1 |
|    1 | name1 |   123 |   3 |
|    6 | name5 |    77 |   1 |
|    5 | name5 |   456 |   1 |
+------+-------+-------+-----+
5 rows in set, 15 warnings (0.002 sec)

【讨论】:

以上是关于Mysql:无论数字的位置如何,都对数字进行分组的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配一个数字中的 7 个相同数字,无论位置如何

Java 数据分组问题

Java 数据分组问题

1048 数字加密(20 分)

mysql语句 如何将查出来的字符串转化为数字

1048 数字加密(20 分)