2012-11-28 38 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的答案是最好的。 –