匹配排序顺序中包含两列之一中唯一值的行的第一个实例

时间:2014-04-29 20:25:54

标签: mysql sql unique multiple-columns

这是我在这里回答的一个问题的变体,但我似乎无法找到解决以下问题的答案。

说我有MySQL表“my_table”:

+----+------+
| id | pid  |
+----+------+
|  1 | NULL | 
|  2 |    1 | 
|  3 | NULL | 
|  4 |    3 | 
+----+------+

我想从这个表中选择行,但我只希望我遇到的第一行在两个特定列(“id”或“pid”)之间具有唯一值,而不是按唯一值进行分组在一栏中。

但是,我也想尊重我正在使用的任何排序选项。我只想匹配首先出现的唯一值,而不是MIN()值。我正在寻找一种非程序方法。

换句话说,如果我用ORDER BY id ASC运行SELECT,我会得到行号#1和#3。如果我用ORDER BY id DESC运行SELECT,我会得到行号#2和#4。

1 个答案:

答案 0 :(得分:0)

您不能使用where上的一些简单having子句或特殊选项来执行此操作。

我认为你可以用

来做
select id, pid
from table t
where not exists (select 1
                  from table t2
                  where (t2.id = t.id or t2.id = t.pid or 
                         t2.pid = t.id or t2.pid = t.pid
                        ) and
                        t2.id < t.id
                 );

嵌套where中的第一个子句正在寻找唯一值。第二个子句t2.id < t.id实现了您想要的排序。换句话说,此查询将一行中的每个值与“之前”行中的值进行比较。你如何定义“之前”是你的意思。以上对应于id asc。对于id desc,您可以使用t2.id > t.id