Учитывая таблицу со столбцами (col1, col2, col3, col4,....), как мы запрашиваем таблицу так, чтобы она возвращала только строки, где определенное подмножество столбцов, например (col2, col4, col5), значения отличаются друг от друга.
Например, для этой таблицы (эта таблица создается после выполнения нескольких кросс-соединений и запросов), определите поднабор столбцов как (t1_id, t2_id, t3_id):
Затем запрос должен вернуть это:
Подмножество столбцов будет переменной и может быть очень большим, поэтому используйте sth, например where t1.id<>t2.id and t1.id<>t3.id and t2.id<>t3.id
не будет удобным подходом,
Простым решением может быть использование критериев NOT IN для столбцов N-1.
Который может быть сокращен для каждого дополнительного NOT IN.
Например, если имеется 5 столбцов:
WHERE t1.id NOT IN (t5.id, t4.id, t3.id, t2.id)
AND t2.id NOT IN (t5.id, t4.id, t3.id)
AND t3.id NOT IN (t5.id, t4.id)
AND t4.id <> t5.id
Другой метод заключается в конкатенировании id и последующем использовании регулярного выражения.
-- test table with numbers
create table test (id int primary key);
insert into test values (1),(2),(3),(4),(5);
-- cross joining the numbers and only get those with unique number combinations
select t1.id as id1, t2.id as id2, t3.id as id3, t4.id as id4, t5.id as id5
from test t1
cross join test t2
cross join test t3
cross join test t4
cross join test t5
where concat_ws(' ',t1.id,t2.id,t3.id,t4.id,t5.id) not rlike '\\b(\\d+)\\b.*\\b\\1\\b';
Протестировано на dbfiddle для MariaDb 10.2
not in
моем понимании смысл для меня.
Однако MariaDB поддерживает регулярные выражения PCRE. И они поддерживают обратные ссылки. Поэтому вы можете использовать их для поиска дубликатов:
where concat(',', concat_ws(',', t1.id, t2.id, t3.id), ',') not regexp '([^,]+).*,\1,'
Обратите внимание, что вам, возможно, придется удвоить обратную косую черту, потому что это часто символ escape.