2011-11-18 80 views
2

我下表MySQL的:翻过两行选择不同的组合,不重复计算

dc rc 
---------- 
    AE GB 
    DE US 
    CN DE 
    DE TT 
    US DE 
    GB AE 

我想选择所有独特的DC,RC组合,但不考虑顺序的都有。特别是,MySQL select应该返回

dc rc 
---------- 
    AE GB 
    DE US 
    CN DE 
    DE TT 

即它不应该重复计算AE-GB和DE-US。我发现了一些类似的问题,例如当数据库是总是显示两次的关系之一时(例如在Filter SQL query by a unique set of column values, regardless of their order上)。但是,这不是这种情况,因为不能保证条目出现两次(在大多数情况下它不会)。

显然,

SELECT DISTINCT dc, rc FROM table GROUP BY dc, rc 

不会做的伎俩。

我感谢所有帮助

回答

4

尝试:

(编辑,包括附加列)

select dc, rc, min(other_column1), sum(other_column2) /*etc as required*/ 
from 
(select dc, rc, other_column1, other_column2 from table where rc >= dc 
union all 
select rc, dc, other_column1, other_column2 from table where rc < dc) v 
group by dc, rc 
+0

+1有趣的解决方案 – Devart

+0

对不起,但这并不工作。它给我完全一样,当我运行“SELECT distinct dc,rc FROM table” 但是也许集合操作是要走的路。 我认为它可以通过在SQL语句中使用NOT EXISTS或EXISTS之类的东西来解决。 这将只允许选择不同的rc,dc,但如果已经选择了特定的rc,dc组合,则不会。 但我似乎无法管理这个... 有什么建议吗? – devmag

+0

@ user1053779,您是否使用您在示例中提供的数据集?当我这样做时,我会得到你想要的输出数据集。 –

0

SQL服务器是我的事,所以你可能需要翻译,但这应该做它

Select Distinct dc, rc 
From 
(Select dc,rc From SomeTable 
    Union 
    Select rc,dc From SomeTable 
) BothWays 

联盟有效地做一个独特的,所以它应该工作。

+0

它没有工作,结果并不如预期。 – Devart

+0

是的,它以某种方式不起作用。我猜想关键是“双向”,这可能在MySQL中不可用。 我已经想过为每个连接字符串的组合创建一个字段,然后按字母顺序排序字符串。这可能会给我一些相同的东西 美国 - DE DE - 美国 因此,我可以做一个明确的这个“新标识符”。然而,这个标识符可能并不是唯一的。但是必须有一种方法可以通过巧妙的查询来实现。 – devmag

+0

@devmag:BothWays是一个表别名。 –

1

这里有一个替代方案,应该提供相同的答案马克的:

SELECT A.DC, A.RC 
FROM tab A 
LEFT JOIN tab B 
ON A.DC = B.RC 
AND A.RC = B.DC 
AND A.DC >= B.DC 
WHERE B.RC IS NULL