mySQL - 获取每个id

时间:2015-08-12 13:24:29

标签: mysql

我有下表和随机数据:

+--+-----+
|id|data | // + Any other Constant rows
+--+-----+
|1 |P    | // 1. of id1
+--+-----+ 
|1 |Q    | // 2. of id1
+--+-----+
|2 |R    | // 1. of id2
+--+-----+
|3 |S    | // 1. of id3
+--+-----+
|3 |a    | // 2. of id3
+--+-----+
|3 |C    | // 3. of id3
+--+-----+

让我们说,我需要每个id的每个SECOND条目。

结果应为:

+--+-----+
|id|data | // + Any other Constant rows
+--+-----+
|1 |Q    | // 2. of id1
+--+-----+
|3 |a    | // 2. of id3 and none of id2
+--+-----+

我不知道。我知道如何获得每个id的第一个

SELECT DISTINCT id, data FROM tablename

但是这并没有解决我在第n个条目中遇到的问题。该表格简化:还存在唯一ID(如果它可以解决任何问题)

有人有答案吗?

3 个答案:

答案 0 :(得分:1)

你可以这样做:

SELECT `id`,`data`
FROM
(SELECT t1.id, t1.data, count(*) as row_number 
 FROM TableName t1
 JOIN TableName t2 ON t1.id = t2.id AND t1.data >= t2.data
 GROUP BY t1.id, t1.data) as temptable
WHERE row_number=2

<强>解释

row_number列是按id列分区的记录的序号。

如果执行内部查询,则会产生如下结果:

id        row_number
--------------------
1         1
1         2
2         1
3         1
3         2 
3         3

使用外部查询,我们选择row_number=2的记录。

重要: 您应该使用其他唯一列(正如您在问题下方的评论中提到的那样)而不是data。因为,它是根据data列的顺序进行分区的。

修改

此处条件t1.id = t2.id AND t1.data >= t2.data用于根据t2.data按内容排序。然后,我们根据row_number订单和id分区等条件创建列data

答案 1 :(得分:1)

我刚试过这个并且它有效。这可能会更高效,因为它不使用连接,但只读取表中的记录

set @row_num:=0;
set @lastid:=0;
Select id, data from
(select id, data, if(id<>@lastid, @row_num:=1, @row_num:=@row_num+1) as row_number, @lastid:=id from tablename order by id) temptab
where row_number = 2

基本上,您正在select语句中构建行号计数器。 last_id位分区,因此每个新ID都会重新开始行号。

答案 2 :(得分:0)

  

免责声明:
  这可能不是最佳答案。我当时只是在寻找比平时更多的解决方案,并且认为分享可能会很有趣。

以下是使用Enum.toString()子句中的子查询来解决此问题的方法:

SELECT

它看起来很像@RagingBull的答案,而且更糟糕,因为每行都要执行子查询。