MySQL SELECT DISTINCT 多列

Posted

技术标签:

【中文标题】MySQL SELECT DISTINCT 多列【英文标题】:MySQL SELECT DISTINCT multiple columns 【发布时间】:2012-08-29 23:43:26 【问题描述】:

假设我在 mysql 数据库的表中有列 a, b c, d。我想要做的是在我的表中选择所有这 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 的不同值。不是价值观的独特组合

【问题讨论】:

如果它有任何唯一的列,这将不起作用。 distinct 不适用于唯一列。 没有一列是唯一的 那么只要你不使用 join 就会得到正确的结果 您应该解释“所有这 4 列的不同值”是什么意思,因为它对您的意义必须不同于通常意味着这些查询不返回您想要的内容。样本数据和样本输出将是一种简洁的表达方式。 我想要 a、b、c 和 d 的不同值,而不是值的组合 【参考方案1】:

反正我知道这个问题太老了:

SELECT a, b
FROM mytable
GROUP BY a, b;

这会给你所有的组合。

【讨论】:

有点酷。 “分组依据”强制区分。是这样吗? 能否请您详细说明一下查询? @ncastro 道歉,但这个答案不能满足问题。 这个对于大表来说很慢。【参考方案2】:

这有帮助吗?

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

【讨论】:

如果我只需要前两列的不同结果但需要显示所有列怎么办... ncastro 的更好。无论如何,更酷,更容易。 嘿内西姆,谢谢!顺便说一句,如果“my_table”是一个完整的查询,我怎么能按名称调用它并一次又一次地回忆它 但是这个结果给出了逗号分隔的值。我怎样才能摆脱这个问题。 Chayan,这是一个不同的问题,但它是 REPLACE(group_concat(DISTINCT d),',',' ')【参考方案3】:

猜测你想要的结果,所以也许这就是你想要的查询

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

【讨论】:

这也有效,但我更喜欢 Nesim Razon 的回答中结果之间的分离。谢谢 酷 - 我打算把它们结合起来 如果您希望所有列中的 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 SELECT e,f FROM ( SELECT DISTINCT zdjh AS e FROM tj_xhqd` UNION SELECT DISTINCT sjsj AS f FROM tj_xhqd UNION SELECT DISTINCT xhqd AS g FROM tj_xhqd) a`给我Error Code: 1054 Unknown column 'f' in 'field list'【参考方案4】:

另一种简单的方法是使用concat()

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

【讨论】:

抱歉,我在 Derby 数据库中找不到任何等价物。 这很聪明,正是我所需要的 这对我有用。我不知道如何将其他答案与查询中的多个联接一起使用 对于大表来说非常慢。【参考方案5】:

你的两个问题都是正确的,应该会给你正确的答案。

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

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 的不同值,而不是不同的值组合 @hmd:感谢您的解决方案。正是我需要的。有没有办法包含where 条件?我只想要计数大于 1 的行。尝试了select distinct a,b,c,count(*) from MyTempTable group by a,b,c order by count(*) desc where count(*)>1;,但没有用。 @Nav42 您需要使用having count(*) > 1 而不是where,因为这是聚合查询。顺便说一句,我的回答并没有完全解决上面概述的 OP 问题。无论如何很乐意提供帮助。 有效。非常感谢你。选择distinct a,b,c,count(*) from MyTable group by a,b,c having count(*) > 1 order by count(*) desc 【参考方案6】:

这将为所有列提供 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

【讨论】:

很容易解决我的问题的好例子。谢谢。 它会给我单列中的值如果我想单独显示它们怎么办?

以上是关于MySQL SELECT DISTINCT 多列的主要内容,如果未能解决你的问题,请参考以下文章

MySQL_select distinct无法实现只对单列去重,并显示多列结果的解决方法

hive mysql count distinct 多列

mysql 多列唯一索引在事务中select for update是否行锁

Oracle Distinct子句

Bigquery SELECT * WHEN COUNT(DISTINCT value) 不起作用

2.MySQL的select distinct语句