Mysql "рядом" дублируют только с рисунком - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу запрос MySQL:

, чтобы показать "почти" повторяющиеся строки с: ссылкой и той же ссылкой + шаблон "- ??"(«-» и ТОЛЬКО 2 символа, «?» - случайный символ).

Пример с таблицей с идентификатором, ссылка:

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

Я пробовал много разных запросов без успеха ... поэтому я не буду публиковать бесполезный запрос.Я не знаю, насколько мне ясно, но пример показывает, что именно я хочу.Спасибо!

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Вы ищете все ссылки, которые имеют аналог в той же таблице, где две ссылки отличаются только на последние три символа '-??'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;
0 голосов
/ 22 ноября 2018

Вот еще один подход: добавить вычисляемый столбец в таблицу, содержащую ссылку минус конечный '- ??'.Затем создайте индекс для этого столбца.

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 demo: https://rextester.com/OLHJ35843

0 голосов
/ 21 ноября 2018

Я думаю, что вы хотите:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...