如何在不使用group by语句的情况下选择不同的行

时间:2012-06-06 21:18:14

标签: mysql sql

A B C
1 1 1 
1 1 1 
2 2 2 
2 2 2 
3 3 3 
3 3 3 
4 4 4 
4 4 4 
5 5 5 
5 5 5 
5 5 5 
6 6 6
6 6 6 

我只输出不同的行而不使用group by语句。我不能使用group by因为它使mysql挂起。所以它应该返回

1 1 1
2 2 2 
3 3 3 
4 4 4 
5 5 5 
6 6 6 

我正在使用DISTINCT进行内部联接。这也不起作用:

SELECT DISTINCT * FROM TABLEA inner join TABLEB on TABLEA.A = TABLEB.A 

4 个答案:

答案 0 :(得分:13)

SELECT DISTINCT A,B,C FROM TABLE;

根据mysql文档,DISTINCT指定从结果集中删除重复的行(http://dev.mysql.com/doc/refman/5.0/en/select.html

我在jsfiddle上创建了一个示例,它可以运行恕我直言

create table tablea (A int,B int,C int);
create table tableb (A int);

INSERT INTO tablea VALUES (1,1,1),(1,1,1),(2,2,2),(2,2,2),(3,3,3),(3,3,3),(4,4,4),(4,4,4),(5,5,5),(5,5,5),(5,5,5),(6,6,6),(6,6,6);
INSERT INTO tableb VALUES (1),(1),(1),(1),(1);

SELECT DISTINCT tablea.A,tablea.B,tablea.C FROM tablea INNER JOIN tableb ON tablea.A=tableb.A;

随时可以对此SQLFiddle进行试验。

答案 1 :(得分:9)

This may totally shock you but MySQL uses GROUP BY under the hood to execute DISTINCT !!!

以下是您可能想要尝试的内容

如果表格被称为mytable,请执行以下两项操作:

首先运行

ALTER TABLE mytable ADD INDEX ABC (A,B,C);`

其次,运行此查询

SELECT A,B,C FROM mytable GROUP BY A,B,C;

GROUP BY实际上在索引存在时效果更好!!!

以下是证明其有效的示例代码

mysql> drop database if exists cool_cs;
Query OK, 1 row affected (0.04 sec)

mysql> create database cool_cs;
Query OK, 1 row affected (0.00 sec)

mysql> use cool_cs
Database changed
mysql> create table mytable
    -> (A int,B int,C int, key ABC (A,B,C));
Query OK, 0 rows affected (0.08 sec)

mysql> INSERt INTO mytable VALUES
    -> (1,1,1),(1,1,1),(2,2,2),(2,2,2),(3,3,3),
    -> (3,3,3),(4,4,4),(4,4,4),(5,5,5),(5,5,5),
    -> (5,5,5),(6,6,6),(6,6,6);
Query OK, 13 rows affected (0.06 sec)
Records: 13  Duplicates: 0  Warnings: 0

mysql> select a,b,c FROM mytable group by a,b,c;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    1 |    1 |
|    2 |    2 |    2 |
|    3 |    3 |    3 |
|    4 |    4 |    4 |
|    5 |    5 |    5 |
|    6 |    6 |    6 |
+------+------+------+
6 rows in set (0.02 sec)

mysql>

试一试!!!

答案 2 :(得分:2)

如果您(或其他任何人)真的想要在不使用DISTINCT或GROUP BY语句的情况下获得不同的重新分析,这可能是这样的:

SELECT
    a.name
FROM person a
LEFT JOIN person b
    ON (a.name = b.name OR (a.name IS NULL AND b.name IS NULL))
    AND a.id < b.id
WHERE b.id IS NULL

但这是一件古怪的事情。

答案 3 :(得分:1)

DISTINCT关键字可以满足您的需求。即,如果你的表名是A,select distinct * from A就可以了。

比照。 mysql手册:http://dev.mysql.com/doc/refman/5.0/en/select.html