【问题标题】:MySQL: Select rows that have only unique values except for a columnMySQL:选择除列之外只有唯一值的行
【发布时间】:2012-11-28 14:01:09
【问题描述】:

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

例如,如果我有寄存器:

+----+--------------+-------------+------+------+-------+-----+
| 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 的 TIME 不同)。

这是表结构

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    |                |
+--------------+--------------+------+-----+---------+----------------+

谢谢。

【问题讨论】:

  • 假设任何非键列值都可以更改是否安全?另外,您在查询中选择了哪些列?
  • 一千个寄存器对数据库引擎来说根本算不了什么。
  • 我想检索整个寄存器(除了id之外的所有列),并且我有一个很大的数据库,所以性能是一个问题(我删除了之前的帖子由于错误,所以我在这里复制它并更改寄存器的数量)。

标签: mysql sql


【解决方案1】:

您可以将max() 聚合应用于ID 列,然后将GROUP BY 应用于其余部分:

select max(id) id, SATELLITE_ID, ATT_TYPE_ID, TIME, Roll, Pitch, yaw
from attitude
group by SATELLITE_ID, ATT_TYPE_ID, TIME, Roll, Pitch, yaw
order by id

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 |

【讨论】:

  • 如果 OP 需要在他/她的查询中包含 ID 列,这就是要走的路。
【解决方案2】:

试试:

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

【讨论】:

  • 如果 OP 也需要列 ID 怎么办?
  • 那么 bluefeet 的回答是最好的。
【解决方案3】:

试试这个:

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

【讨论】:

  • DISTINCT 的表现如何?比简单的 SELECT 还要糟糕吗?
  • @EtoreMarcariJr。是的,distinct 比简单选择(没有group by)更糟糕,因为数据库引擎必须删除重复项。
【解决方案4】:
select max(ID) from attitude
  group by SATELLITE_ID, ATT_TYPE_ID, TIME, ROLL, PITCH, YAW;

这通过 SATELLITE_ID、ATT_TYPE_ID、TIME、ROLL、PITCH 和 YAW 的不同值任意分组。如果您遗漏了其中一些字段,那仅意味着可能会有更少的群体,彼此不同的理由也更少。

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多