繁体   English   中英

MYSQL select 两列中的不同值

[英]MYSQL select DISTINCT values in two columns

我想 select 数据库中的不同值。 让我通过一个简单的例子来告诉你。

桌子:

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重复只是它们的顺序不同。 我不想 select 这些,我想要两列的不同值,请帮忙!

使用 GROUP BY 怎么样?

SELECT foo,bar FROM my_table GROUP BY foo,bar

非常非常邪恶和邪恶:

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

怎么样:

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

Output:

foo bar
--- ---
d   a
   SELECT 
       foo, bar
   FROM tableX
   WHERE foo <= bar
 UNION 
   SELECT 
       bar, foo
   FROM tableX
   WHERE bar < foo

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

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;
SELECT DISTINCT foo, bar FROM table WHERE
CONCAT(',',foo,bar,) NOT IN ( SELECT CONCAT(',',bar,foo) FROM table )

这对我有用:

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

所以我知道你想将 2 个字段组合成一个 SQL 搜索结果行......我发现这里的大多数答案都非常混乱。

这是我必须的时候总是这样做的方式(可以用多行和多表放大):

SELECT a.field1 FROM (<br>
&nbsp;&nbsp;&nbsp;&nbsp;SELECT foo AS field1 FROM tableX<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UNION<br>
&nbsp;&nbsp;&nbsp;&nbsp;SELECT bar AS field1 FROM tableX<br>
) a

OR

SELECT DISTINCT a.field1 FROM (<br>
&nbsp;&nbsp;&nbsp;&nbsp;SELECT foo AS field1, conditions FROM tableX<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UNION ALL<br>
&nbsp;&nbsp;&nbsp;&nbsp;SELECT bar AS field1, conditions FROM tableX<br>
) a WHERE a.conditions=1 (added extra conditions to filter out some results)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM