mysql“近”复制只有一个模式

sqxo8psd  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(342)

我想要一个mysql查询:
要显示“接近”的重复行,请使用:一个引用和相同的引用+模式“-??”(“-”和2个字符,“?”是随机字符)。
带有id的表的示例,参考:

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-??在table上)。
我的表名是products,简化结构是:

id,reference

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

ukdjmx9f

ukdjmx9f1#

我想你想要:

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;
8yparm6h

8yparm6h2#

下面是另一种方法:向包含引用的表中添加一个计算列,减去后面的“-??”。然后在该列上创建索引。

alter table mytable add column refshaved varchar(20) generated always as 
  (case when reference like '%-__' 
        then left(reference, length(reference)-3) 
        else reference end) stored;

create index idx on mytable(refshaved, reference);

select *
from mytable t1
where exists
(
  select *
  from mytable t2
  where t2.refshaved =  t1.refshaved
    and t2.reference <> t1.reference
)
order by reference;

rextester演示:https://rextester.com/olhj35843

n3schb8v

n3schb8v3#

您正在查找在同一个表中具有对应项的所有引用,其中两个引用仅相差最后三个字符 '-??' . 在 LIKE 通配符为 _ .
查询:

select *
from mytable t1
where exists
(
  select *
  from mytable t2
  where t1.reference like concat(t2.reference, '-__')
     or t2.reference like concat(t1.reference, '-__')

)
order by reference;

相关问题