在MySQL中选择不同的两列组合

35
我有一个看起来像这样的MySQL表:
1   value1    value2    3534
2   value1    value1    8456
3   value1    value2    3566
4   value1    value3    7345
5   value2    value3    6734
我需要一个查询语句来选择所有具有不同列2和3的行,例如,对于此示例,我想要的输出如下所示:
1   value1    value2    3534
2   value1    value1    8456
4   value1    value3    7345
5   value2    value3    6734

我在stackoverflow上找到了一些示例,但它们都是在每个列上单独进行不重复选择。

6个回答

43

更新1

最好使用此方法,而不是上面的方法。

SELECT id, col2, col3, col4
FROM yourtable
GROUP BY col2, col3;

演示

我之所以这么说是因为,在这个案例中,使用CONCAT时我得不到期望的结果。第一个查询语句返回了5行,但CONCAT只返回了4行,这是错误的。

希望你明白我的意思。


假设表中的列为(id,col2,col3,col4)。

SELECT DISTINCT(CONCAT(col2, col3)) as "dummy column", id, col2, col3, col4
FROM yourtable
GROUP BY CONCAT(col2, col3);

或者

SELECT id, col2, col3, MIN(col4)
FROM yourtable
GROUP BY col2, col3;

实时工作示例


24

假设第一列是唯一的,你可以这样做:

SELECT id, col2, col3, col4
FROM yourtable
WHERE id IN
(
    SELECT MIN(id)
    FROM yourtable
    GROUP BY col2, col3
)

在线查看示例:sqlfiddle


1
假设表中的列为(id, col1, col2, col3),您可以:
SELECT  *
FROM    YourTable yt
JOIN    (
        SELECT  MIN(id) as minid
        FROM    YourTable
        GROUP BY
                col1, col2
        ) filter
ON      filter.minid = yt.id

0

使用group by方法返回了额外的行,而明确检查每个字段虽然更长但与count(Distinct..)返回相同数量的记录。

SELECT id, col2, col3, col4
FROM yourtable yt
WHERE id =
(
 SELECT MIN(id)
 FROM yourtable yt1
 WHERE yt.col2 = yt1.col2
 AND yt.col3 = yt1.col3
)

如果您能展示测试数据,说明在这种情况下得出的答案与已接受的答案不同,那将非常有用。据我所知,唯一可能导致不同的原因是存在NULL值。DISTINCT允许包含NULL的列,但group by会省略具有此类列的行。 - ToolmakerSteve

0

这个查询确保了column1和column2的组合是唯一的,同时选择column three的最小值

SELECT col1, col2, MIN(col3)
FROM yourTable
GROUP BY col1, col2

0

最简单的查询是:

SELECT col1, col2, MIN(col3)
FROM myTable
GROUP BY col1, col2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接