MySql选择多列唯一行

时间:2014-02-04 19:24:48

标签: mysql sql distinct

编写查询时遇到一些小困难:

我有以下表格:

ID   |   FromId   |  ToId
--------------------------
1         10          15
2         10          15
3         15          10
4         15          10
5         15          20
6         14          15
7         20          15
8         20          10
9         10          20
10        10           1

不,我想从这里获得价值10的独特价值

并且我的意思是,例如,我想要完成的结果,如果变量是10

FromId   |   ToId
------------------
10            15
20            10
10             1

我当然不确定是否有可能完成那样的事情......

在这种情况下对我来说

10   20 == 20   10 

但对于sql而言:/

我认为人们完全不理解我......

我需要与10的组合中的唯一性

4 个答案:

答案 0 :(得分:3)

您可以这样做:

select least(fromId, toId) as fromId, greatest(fromId, toId) as toId
from MyTable t
where fromId = 10 or toId = 10
group by least(fromId, toId), greatest(fromId, toId);

编辑:

(回答您关于表现的问题。)

您应该在fromIdtoId上建立索引。

您的原始数据具有重复值,因此必须删除重复项。在MySQL中,这需要通过显式order by或使用group by(以及关联的文件排序)对数据进行排序。上述查询应该与使用distinct

的任何查询一样执行

如果您有两个索引,在t(fromId, toId)t(toId, fromId)上,则以下可能效果更佳:

select distinct fromId, toId
from MyTable t
where fromId = 10
union all
select distinct fromId, toId
from MyTable t
where toId = 10 and
      not exists (select 1 from MyTable t2 where t2.fromId = t.fromId and t2.toId = t.fromId);

MySQL可以通过扫描索引来执行distinct。我不确定它是否在实践中发挥作用。

答案 1 :(得分:2)

我认为这应该有用,

SELECT * FROM myTable WHERE FromId = 10 OR ToId = 10;

答案 2 :(得分:0)

SELECT DISTINCT FromId,ToId FROM myTable  WHERE FromId = 10 OR ToId = 10

答案 3 :(得分:0)

尝试区别于OR。

select distinct FromId,ToId from Test where FromId = 10 OR ToId=10;

http://sqlfiddle.com/#!2/18384/3