MySQL SELECT DISTINCT多列


77

假设我a, b c, d在MySQL数据库的表中有列。我想做的是选择表中所有这4列的所有唯一值(只有唯一值)。我尝试了类似的东西:

SELECT DISTINCT a,b,c,d FROM my_table;
SELECT DISTINCT a,b,c,d FROM my_table GROUP BY a,b,c,d;

这些都不起作用。有人可以帮忙吗?

谢谢

注意我想要分别显示各列的不同值a, b, c d。不是价值的独特组合


如果它具有任何唯一列,则将不起作用。唯一列不起作用。
Hammad Khan 2012年

这些列都不是唯一的
user765368 2012年

那么只要您不使用join,就可以得到正确的结果
Hammad Khan

2
您应该解释“这4列中所有列的不同值”的含义,因为它对您的含义不同于通常使那些查询不返回所需内容的含义。样本数据和样本输出将是一种简洁的表达方式。
丹·格罗斯曼

2
我想要a,b,c和d的不同值,而不是值的组合
user765368 2012年

Answers:


51

能帮上忙吗?

select 
(SELECT group_concat(DISTINCT a) FROM my_table) as a,
(SELECT group_concat(DISTINCT b) FROM my_table) as b,
(SELECT group_concat(DISTINCT c) FROM my_table) as c,
(SELECT group_concat(DISTINCT d) FROM my_table) as d

8
如果我仅需要前两列的不同结果但需要显示所有列
怎么办

1
ncastro的更好。无论如何,更凉爽,更容易。
布法罗

嘿,Nesim,谢谢!顺便说一句,如果“ my_table”是一个完整的查询,我该如何通过名称来调用它并一次又一次地调用它
Tomer

但是此结果给出了逗号分隔的值。我如何摆脱这个问题。
Chayan Biswas

Chayan,这是一个不同的问题,但这是REPLACE(group_concat(DISTINCT d),',',' ')
Slam


20

对您想要的结果进行猜测,所以也许这是您想要的查询,然后

SELECT DISTINCT a FROM my_table
UNION 
SELECT DISTINCT b FROM my_table
UNION
SELECT DISTINCT c FROM my_table
UNION
SELECT DISTINCT d FROM my_table

1
这也可行,但是我喜欢Nesim Razon的回答中更好地区分结果。谢谢
user765368 2012年

太酷了-我打算考虑将它们结合起来
Adrian Cornish 2012年

4
如果要在所有列上使用DISTINCT值,则必须将此查询包装在另一个SELECT语句中,如下所示:SELECT DISTINCT value FROM ( SELECT DISTINCT a AS value FROM my_table UNION SELECT DISTINCT b AS value FROM my_table UNION SELECT DISTINCT c AS value FROM my_table ) AS derived
T. Brian Jones

SELECT e,f FROM ( SELECT DISTINCT zdjh AS e FROM tj_xhqd` UNION SELECT DISTINCT sjsj AS f FROM tj_xhqdUNION SELECT DISTINCT xhqd AS g FROM tj_xhqdError Code: 1054 Unknown column 'f' in 'field list'
a`

18

另一个简单的方法是 concat()

SELECT DISTINCT(CONCAT(a,b)) AS cc FROM my_table GROUP BY (cc);

抱歉,但是在Derby Database中找不到任何等效项。
Pranjal Choladhara'5

这很聪明,这正是我所需要的
xtian

这对我有用。我不知道如何将其他答案与查询中的多个联接一起使用
murume

无效的列名“ cc”。
Paddymac

9

您的两个查询都是正确的,应该给您正确的答案。

我建议使用以下查询来解决您的问题。

SELECT DISTINCT a,b,c,d,count(*) Count FROM my_table GROUP BY a,b,c,d
order by count(*) desc

那就是添加count(*)字段。这将使您了解使用group命令消除了多少行。


我想要不同的a,b,c和d值,而不是不同的值组合
user765368 2012年

@hmd:感谢您的解决方案。正是我所需要的。有没有包含where条件的方法?我只需要计数大于1的行。尝试过select distinct a,b,c,count(*) from MyTempTable group by a,b,c order by count(*) desc where count(*)>1;但没有用。
2013年

@ Nav42你需要使用having count(*) > 1没有where因为这是汇总查询。顺便说一句,我的回答不能完全解决上述OP的问题。反正很乐意提供帮助。
哈马德·汗2013年

作品。非常感谢你。选择distinct a,b,c,count(*) from MyTable group by a,b,c having count(*) > 1 order by count(*) desc
导航

9

这将在所有列中提供DISTINCT值:

SELECT DISTINCT value
FROM (
    SELECT DISTINCT a AS value FROM my_table
    UNION SELECT DISTINCT b AS value FROM my_table
    UNION SELECT DISTINCT c AS value FROM my_table
) AS derived

很好的例子轻松解决了我的问题。谢谢。
delliottg 2015年

如果我想分别显示它们,它将为我提供单列中的值?
Moeez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.