mysql distinct两列_sql-MYSQL在两列中选择DISTINCT值

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值