这是我在这里回答的一个问题的变体,但我似乎无法找到解决以下问题的答案。
说我有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。
答案 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
。