首页 > 解决方案 > Mysql“near”仅与模式重复

问题描述

我想要一个 MySQL 查询:

显示“近”重复行:参考和相同参考+模式“-??” (“-”和 2 个字符而已,“?”是一个随机字符)。

带有 id,reference 的表的示例:

id reference
1 DGGDL 
2 DGGDL 
3 HSDKH
4 HSDKH-45
5 2KXQF
6 2KXQF
7 2J6SF
8 2J6SF-442
9 FSM
10 148-54
11 148-54
12 148
13 BWZM-67

我想在这张桌子上提出​​一个确切的结果:

 id reference
 3 HSDKH
 4 HSDKH-45
 10 148-54
 12 148

2J6SF-442 不在这里,因为模式只是“-”+ 2 个字符(442 是 3 个字符,所以它与模式不匹配)。HSDKH 和 HSDKH-45 在结果中,因为 HSDKH-45 匹配“HSDKH-??” 并且 HSDKH 存在,BWZM-67 不在结果中,因为它匹配“BWZM-??” 但表中没有参考“BWZM”。与模式不匹配的所有其他“重复项”都从结果中排除(如 DGGDL,因为表中没有像 DGGDL-?? 这样的引用)。

我的表名是products,简化的结构是:

id,reference

我尝试了许多不同的请求但没有成功……这就是为什么我不会发布无用的请求。我不知道我是否很清楚,但这个例子正是我想要的。谢谢 !

标签: mysqlsql

解决方案


我想你想要:

select t.col
from t
where exists (select 1
              from t t2
              where t2.col like concat(t.col, '%-__') or
                    t1.col like concat(t2.col, '%-__')
             );

如果这两个字符是特定的数字:

              where t2.col regexp concat(t.col, '-[0-9]{2}$') or
                    t1.col regexp concat(t2.col, '-[0-9]{2}$')

或者,如果您希望每组的结果显示在一行中:

select group_concat(t.col)
from t
group by substring_index(t.col, '-', 1)
having sum(t.col like '%-__') > 0 and
       sum(t.col not like '%-__') > 0;

推荐阅读