sql-MYSQL在两列中选择DISTINCT值
我想在数据库中选择不同的值。 让我来看一个简单的例子。
表:
foo bar
--- ---
a c
c f
d a
c a
f c
a c
d a
a c
c a
f c
是的,假设我的SQL是a c。这些是我的结果:
foo bar
--- ---
a c
c f
d a
c a
f c
但是,问题在于重复2678226901101181184000/c a只是重复顺序不同。 我不想选择这些,我希望这两列中都有不同的值,请帮忙!
Jake asked 2019-12-28T22:34:41Z
8个解决方案
81 votes
如何使用GROUP BY?
SELECT foo,bar FROM my_table GROUP BY foo,bar
Yaniv answered 2019-12-28T22:35:23Z
45 votes
非常邪恶和邪恶:
select distinct
least(foo, bar) as value1
, greatest(foo, bar) as value2
from table
nabuchodonossor answered 2019-12-28T22:34:59Z
7 votes
怎么样 :
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
Kevin Burton answered 2019-12-28T22:35:43Z
3 votes
您要求的是与对称闭包相反的东西(我不知道它是否具有特殊名称;反对称的东西,因为它不是闭包)。 对于需要比较两个不同列的闭合和闭合之类的东西,可以使用联接。 为了确保当两行在列之间重复时,不会过滤掉这两行,您需要一种区分重复项并包含其中一个重复项的方法,例如通过包含其中第一行较小的那对行。
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;
outis answered 2019-12-28T22:36:04Z
3 votes
SELECT
foo, bar
FROM tableX
WHERE foo <= bar
UNION
SELECT
bar, foo
FROM tableX
WHERE bar < foo
ypercubeᵀᴹ answered 2019-12-28T22:36:19Z
2 votes
SELECT DISTINCT foo, bar FROM table WHERE
CONCAT(',',foo,bar,) NOT IN ( SELECT CONCAT(',',bar,foo) FROM table )
Talha Ahmed Khan answered 2019-12-28T22:36:35Z
1 votes
这对我有用:
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
bfortuner answered 2019-12-28T22:36:54Z
0 votes
因此,据我了解,您希望将2个字段组合成一个SQL搜索结果行...我发现这里的大多数答案非常令人困惑。
这是我总是必须这样做的方式(可以按比例放大多行和多表):
选择a.field1 FROM(
从tableX中选择foo AS field1
联盟
选择栏AS field1 FROM tableX
) 一种
要么
选择DISTINCT a.field1 FROM(
SELECT foo AS field1,条件来自tableX
全联盟
SELECT条AS字段1,条件来自tableX
),其中a.conditions = 1(添加了额外的条件以过滤掉一些结果)
M A answered 2019-12-28T22:38:07Z