2012-11-28 35 views
0

这是我的情况:我有一个重复值有效的表(除了ID字段),我想只检索唯一值。MySQL:选择除列以外唯一值的行

例如,如果我有寄存器:

+----+--------------+-------------+------+------+-------+-----+ 
| ID | SATELLITE_ID | ATT_TYPE_ID | TIME | ROLL | PITCH | YAW | 
+----+--------------+-------------+------+------+-------+-----+ 
| 1 |   1 |   1 | 2012 | 1.0 | 2.0 | 1.3 | 
+----+--------------+-------------+------+------+-------+-----+ 
| 2 |   1 |   1 | 2012 | 1.0 | 2.0 | 1.3 | 
+----+--------------+-------------+------+------+-------+-----+ 
| 3 |   1 |   1 | 2011 | 1.0 | 2.0 | 1.3 | 
+----+--------------+-------------+------+------+-------+-----+ 

我想检索公正2和3(ID 1和2是 “相等”,和3具有不同的时间)。

这表结构

mysql> describe attitude; 
+--------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+--------------+------+-----+---------+----------------+ 
| ID   | int(11)  | NO | PRI | NULL | auto_increment | 
| SATELLITE_ID | int(11)  | NO |  | NULL |    | 
| ATT_TYPE_ID | int(11)  | NO |  | NULL |    | 
| TIME   | varchar(4) | NO |  | NULL |    | 
| ROLL   | double  | NO |  | NULL |    | 
| PITCH  | double  | NO |  | NULL |    | 
| YAW   | double  | NO |  | NULL |    | 
+--------------+--------------+------+-----+---------+----------------+ 

THX。

+0

它是安全的假设,任何非键列的值可以改变?另外,您在查询中选择了哪一列? –

+0

对于数据库引擎,千位寄存器实际上没有任何意义。 –

+0

我想检索整个注册表(除ID以外的所有列),并且我有一个大型数据库,因此性能问题是一个问题(由于错误,我删除了以前的帖子,所以我在这里复制并更改了数字的寄存器)。 –

回答

2

您可以将max()骨料适用于ID列,然后GROUP BY休息:

SQL Fiddle with Demo

结果:

| ID | SATELLITE_ID | ATT_TYPE_ID | TIME | ROLL | PITCH | YAW | 
--------------------------------------------------------------- 
| 2 |   1 |   1 | 2012 | 1 |  2 | 1 | 
| 3 |   1 |   1 | 2011 | 1 |  2 | 1 | 
+1

如果OP需要在他/她的查询中包含ID列,这是要走的路。 –

0
select max(ID) from attitude 
    group by SATELLITE_ID, ATT_TYPE_ID, TIME, ROLL, PITCH, YAW; 

这任意基团通过不同SATELLITE_ID,ATT_TYPE_ID,TIME,侧倾,俯仰和偏航的值。如果你忽略了其中的一些领域,那只意味着可能会有更少的团体,而有更少的理由可以相互区分。

1

试试这个:

select SATELLITE_ID, ATT_TYPE_ID, TIME, ROLL, PITCH, YAW 
from ATTITUDE 
group by SATELLITE_ID, ATT_TYPE_ID, TIME, ROLL, PITCH, YAW 

,或者您可以使用distinct

select distinct SATELLITE_ID, ATT_TYPE_ID, TIME, ROLL, PITCH, YAW 
from ATTITUDE 
+0

DISTINCT的性能如何?它比简单的SELECT更糟吗? –

+0

@EtoreMarcariJr。是的,'distinct'比简单的select(没有'group by')更糟糕,因为数据库引擎必须删除重复项。 – Parado

2

尝试:

SELECT DISTINCT SATELLITE_ID, ATT_TYPE_ID, TIME, ROLL, PITCH, YAW 
FROM ATTITUDE 
+0

如果OP需要“ID”列,该怎么办? –

+0

然后bluefeet的答案是最好的。 –