所以我想从表中选择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。
很抱歉,如果我解释得很糟糕,但我想不出更好的解释。
谢谢你们。
答案 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;