SQL选择col1或col2等于变量的行

时间:2016-06-10 15:29:39

标签: mysql

所以我想从表中选择col1或col2等于变量的行,但是如果已经选择了行,其中col1等于变量(变量X)而col2是其他任何变量(变量Y)那么它将不会选择另一行,其中col2等于变量X,col1等于该变量Y.按TIME列排序的所有内容都将减少。

让我们说这是我的表:

COL1    COL2    TIME    COL4
1       2       0       A
1       2       1       B
2       1       2       C
1       3       3       D
3       1       4       E
4       2       5       F
3       4       6       G
1       2       7       H
4       1       8       I

让我们说变量X等于1,然后我想要这些行:

COL1    COL2    TIME    COL4
4       1       8       I
1       2       7       H
3       1       4       E

所以它不会向我显示这一行

COL1    COL2    TIME    COL4
2       1       2       C

因为已经有一个组合,其中col1 / col2是2/1或1/2。

很抱歉,如果我解释得很糟糕,但我想不出更好的解释。

谢谢你们。

2 个答案:

答案 0 :(得分:1)

编辑:当我认为OP的数据库是SQL Server时,我发布了这个答案。但事实证明,数据库是MySQL。

我认为这个查询应该这样做:

select t.col1, t.col2, t.time, t.col4
  from (select t.*,
               row_number() over (
                 partition by 
                   case when col1 < col2 then col1 else col2 end,
                   case when col1 < col2 then col2 else col1 end
                 order by time desc) as rn
          from tbl t
         where t.col1 = x or t.col2 = x) t
 where t.rn = 1
 order by t.time desc

关键部分是定义row_number partition by子句,使(1, 2)被认为等同于(2, 1),这就是case语句做。一旦分区正常工作,您只需要保留每个&#34;分区的第一行&#34; (where t.rn = 1)排除重复的行。

答案 1 :(得分:1)

做出几个关键假设......

SELECT a.* 
  FROM my_table a 
  JOIN 
     ( SELECT MAX(time) time 
         FROM my_table 
        WHERE 1 IN (COL1,COL2) 
        GROUP 
           BY LEAST(col1,col2)
            , GREATEST(col1,col2)
     ) b 
    ON b.time = a.time;