MySQL,使用MIN()和GROUP BY基于子查询进行选择

时间:2013-08-23 23:43:34

标签: mysql sql group-by subquery min

首先,描述我的数据集。我正在使用SNOMED CT代码并试图从中创建一个可用的列表。相关列是rowId,conceptID和Description。 rowId是唯一的,另外两个不是。我想选择这些代码的一个非常具体的子集:

SELECT * 
  FROM SnomedCode 
  WHERE LENGTH(Description)=MIN(LENGTH(Description))
  GROUP BY conceptID

结果应该是400,000个唯一概念ID(140万个)中的列表,以及每个代码的最短适用描述。上面的查询显然是格式错误的(并且只返回LENGTH(description)= 1的行,因为表中最短的描述是1个字符长。)我缺少什么?

1 个答案:

答案 0 :(得分:3)

SELECT conceptID, MAX(Description)
  FROM SnomedCode A
 WHERE LENGTH(Description)=(SELECT MIN(LENGTH(B.Description))
                              FROM SnomedCode B
                             WHERE B.conceptID = A.conceptID)
 GROUP BY conceptID

“GROUP BY”和“MAX(描述)”并不是必需的,但是作为决胜局添加为具有相同长度的概念ID的不同描述,因为要求包括独特的 conceptIDs。

选择MAX来惩罚可能的领先空间。否则MIN(描述)也可以。

顺便说一下,如果你有超过百万的记录,这个查询需要相当长的时间。使用WHERE子句中添加的( concept-of-conceptIDs-to-test )中的“AND conceptID”进行测试。

表SnomedCode必须具有conceptID的索引。如果没有,查询将永远。