连续检查不同的值-SQL

时间:2018-07-29 05:41:14

标签: mysql sql mariadb

给出一个包含列(col1,col2,col3,col4,....)的表,我们如何查询该表,使其仅返回特定列子集的行,例如(col2,col4, col5)的值互不相同。

例如,对于此表(该表是在执行一些交叉联接和查询之后生成的),将列的子集定义为(t1_id,t2_id,t3_id):

enter image description here

查询应返回以下内容:

{{3}}

列的子集将是可变的,并且可能非常大,因此使用where t1.id<>t2.id and t1.id<>t3.id and t2.id<>t3.id之类的方法不太方便。

2 个答案:

答案 0 :(得分:2)

一个简单的解决方案是对N-1列使用NOT IN条件。
可以为每个附加的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 for MariaDb 10.2

测试

答案 1 :(得分:0)

not in方法对我来说最有意义。

但是,MariaDB supports PCRE regular expressions。这些都支持回引用。因此,您可以使用它们查找重复项:

where concat(',', concat_ws(',', t1.id, t2.id, t3.id), ',') not regexp '([^,]+).*,\1,'

请注意,您可能必须在反斜杠上加倍,因为它通常是转义符。