MYSQL在两列中选择DISTINCT值

时间:2011-07-19 09:07:50

标签: mysql sql

我想在数据库中选择不同的值。让我为您提供一个快速示例。

表:

foo bar
--- ---
a   c
c   f
d   a
c   a
f   c
a   c
d   a
a   c
c   a
f   c

是的,假设我的SQL是SELECT DISTINCT foo, bar from table。这些是我的结果:

foo bar
--- ---
a   c
c   f
d   a
c   a
f   c

但问题是a c / c a重复,只是它们的顺序不同。我不想选择这些,我希望两列都有不同的值,请帮忙!

9 个答案:

答案 0 :(得分:76)

如何使用GROUP BY?

SELECT foo,bar FROM my_table GROUP BY foo,bar

答案 1 :(得分:44)

非常邪恶的&恶:

select distinct
    least(foo, bar) as value1
  , greatest(foo, bar) as value2
from table

答案 2 :(得分:7)

怎么样:

SELECT DISTINCT a.foo,a.bar FROM table a
LEFT JOIN table b ON a.foo=b.bar and a.bar=b.foo
WHERE b.foo IS NULL AND b.bar IS NULL

答案 3 :(得分:3)

你要的是与对称闭包相反的东西(我不知道它是否有一个特殊的名称;反对称的东西,因为它不是一个闭包)。对于需要比较两个不同列的闭包和闭包,可以使用连接。为了确保在跨列复制时不要过滤掉这两行,您需要一种方法来区分重复并包含其中一个,例如通过包含第一个较小的对。

SELECT DISTINCT t1.foo, t1.bar
  FROM `table` t1
    LEFT JOIN `table` t2
      ON t1.foo=t2.bar AND t1.bar=t2.foo 
  WHERE t2.foo IS NULL OR t1.foo <= t1.bar;

答案 4 :(得分:3)

   SELECT 
       foo, bar
   FROM tableX
   WHERE foo <= bar
 UNION 
   SELECT 
       bar, foo
   FROM tableX
   WHERE bar < foo

答案 5 :(得分:2)

SELECT DISTINCT foo, bar FROM table WHERE
CONCAT(',',foo,bar,) NOT IN ( SELECT CONCAT(',',bar,foo) FROM table )

答案 6 :(得分:1)

这对我有用:

SELECT DISTINCT
LEAST(sub.foo, sub.bar) as value_1
, GREATEST(sub.foo, sub.bar) as value_2

FROM
(SELECT
a.foo
,a.bar
FROM
table a
JOIN
table b
on a.foo = b.bar
and a.bar = b.foo) sub

答案 7 :(得分:0)

所以我了解到您想将2个字段组合到一个SQL搜索结果行中...我发现这里的大多数答案非常令人困惑。

这是我经常在需要时执行的方式(可以按比例放大多行和多表):

选择a.field1 FROM(
从tableX中选择foo AS field1
联盟
SELECT bar AS field1 FROM tableX

OR

SELECT DISTINCT a.field1 FROM(
SELECT foo AS field1,条件来自tableX
UNION ALL
SELECT条AS字段1,条件来自tableX
),其中a.conditions = 1(添加了额外的条件以过滤掉一些结果)

答案 8 :(得分:-2)

另外还有nabuchodonossor的答案。

如果您不仅要选择不同的值。请使用 GROUP BY ,如下所示。

SELECT *
GROUP BY least(foo, bar), greatest(foo, bar)
FROM table;

或者,如果你在nabuchodonossor的答案中查询总是因为最少()函数而在value1中存在小值(foo,bar),并且因为< strong> great()功能,所以如果你想按顺序保持秩序,你仍然需要在下面使用 GROUP BY

SELECT foo, bar
GROUP BY least(foo, bar), greatest(foo, bar)
FROM table;