SQL_Надо Получить связанные данные в поиске по таблице

Рейтинг: 0Ответов: 1Опубликовано: 12.01.2023

Затрудняюсь с задачей :

Таблица представлена следующими полями:

1) key
2) id
3) phone
4) mail

Тестовые данные:

1;12345;89997776655;test@mail.ru

2;54321;87778885566;two@mail.ru

3;98765;87776664577;three@mail

4; 66678;87778885566;four@mail.ru

5; 34567;84547895566;four@mail.ru

6; 34567;89087545678;five@mail.ru

На основании заданного поля (это может быть id, phone, mail) получить все "связанные данные"

Например: если задать поиск по условию phone = 87778885566;

Результат должен быть следующим:

2;54321;87778885566;two@mail.ru

4; 66678;87778885566;four@mail.ru

5; 34567;84547895566;four@mail.ru

6; 34567;89087545678;five@mail.ru

НА понимание связанности вывода введите сюда описание изображения

Ответы

▲ 0Принят

Думаю, лучше всего использовать рекурсивный запрос, как сказал @Akina, или делать серию запросов из приложения.Главная сложность - как остановиться в цикле выборки, "горшочек не вари!"))

with recursive rq as(
  select 1 n,key,id,phone,mail,cast(key as varchar) keys, 'first' as fl
  from log where phone='87778885566'
  group by key,id,phone,mail
  union all
  select n+1,b.key,b.id,b.phone,b.mail
     ,concat(keys,',',cast(b.key as varchar)) keys
     ,concat(case when b.id=a.id then 'id ' else ''end
     ,case when b.phone=a.phone then 'phone ' else ''end
     ,case when b.mail=a.mail then 'mail ' else ''end)
  from rq a 
  inner join (select key,id,phone,mail from log group by key,id,phone,mail) b
    on (
        ((b.id=a.id) or (b.phone=a.phone) or (b.mail=a.mail))
      )
     and position(cast(b.key as varchar) in a.keys)<1
)
select  * from rq

Пример