[英]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>
SELECT foo AS field1 FROM tableX<br>
UNION<br>
SELECT bar AS field1 FROM tableX<br>
) a
OR
SELECT DISTINCT a.field1 FROM (<br>
SELECT foo AS field1, conditions FROM tableX<br>
UNION ALL<br>
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.