MySQL - выберите отдельное значение из двух столбцов

У меня есть таблица со следующей структурой:

IdM|IdS
-------
 1 | 2
 1 | 3
 1 | 4
 2 | 1
 2 | 3
 2 | 4
 3 | 1
 3 | 2
 3 | 3
 3 | 4

Как я могу сделать оператор выбора для этой таблицы, который вернет некоторые строки этой таблицы, где в каждой строке определенный идентификатор появляется только один, безразлично, в каком столбце он указан?

Для приведенного выше набора результатов я хотел бы, чтобы запрос возвращал:

-------
 1 | 2
 3 | 4
-------

Чтобы привести другой пример, если вы опустите первую строку в исходном наборе данных:

IdM|IdS
-------
 1 | 3
 1 | 4
 2 | 1
 2 | 3
 2 | 4
 3 | 1
 3 | 2
 3 | 3
 3 | 4

набор результатов должен быть:

-------
 1 | 3
 2 | 4
-------
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это на самом деле интересная проблема. Если я правильно понял вас, вы хотите перебрать набор данных и сохранить только те строки, в которых оба значения никогда раньше не встречались. Вы можете использовать рекурсивный запрос:

with recursive 
    data as (
        select idm, ids, row_number() over(order by idm, ids) rn 
        from mytable 
        where idm <> ids
    ),
    cte as (
        select idm, ids, rn, 1 as to_keep , concat(idm, ',', ids) visited from data where rn = 1
        union all
        select d.idm, d.ids, d.rn,
            (not find_in_set(d.idm, c.visited) and not find_in_set(d.ids, c.visited)),
            case when (not find_in_set(d.idm, c.visited) and not find_in_set(d.ids, c.visited))
                then concat_ws(',', c.visited, d.idm, d.ids)
                else c.visited
            end
        from cte c
        inner join data d on d.rn = c.rn + 1
    )
select idm, ids from cte where to_keep

Первый CTE перечисляет строки, упорядоченные по обоим столбцам. Затем рекурсивный запрос просматривает набор результатов, проверяет, являются ли оба значения новыми, и устанавливает соответствующий флаг для столбцов. Помеченные номера сохраняются для использования при фильтрации в следующей итерации.

Демо на DB Fiddle

Обратите внимание, что, учитывая ваше требование, не все значения могут отображаться в наборе результатов. Рассмотрим следующий набор данных:

 idm   ids
+-----+---
 1     2
 1     3
 1     4

Ваша логика вернет только первую строку.

Для меня это не проблема, на самом деле это желаемый результат. Я хочу использовать это, чтобы предложить возможные записи в таблице, которые похожи и могут быть объединены. Поскольку логика моей таблицы позволяет объединять только две отдельные строки в одну (путем создания новой строки и предоставления в качестве псевдонима версии двух предыдущих строк), это как раз желаемое поведение, если есть вероятность, что идентификатор 1 соответствует всем три других идентификатора. После того, как администратор вручную выполнил слияние или проигнорировал его, либо будут добавлены новые пары идентификаторов, либо будет сопоставлена ​​другая пара. Спасибо за ответ!:)

Adam Baranyai 21.12.2020 03:36

Другие вопросы по теме