选择某列的前n个值不同的行

时间:2015-09-09 08:04:02

标签: mysql sql

我想知道是否可以通过简单有效的方式在MySQL中执行此操作。我想在我的例子中做的是:

我有一张桌子,我将博客文本与FK存储到其他博客信息(标题,用户等)。博客文本可以存储在多行中(如果它是一个非常长的文本)。如果有多行,每行都有一个序列号来知道文本的顺序。

对于我来说,有一个简单的方法,通过一个查询,从最高FK编号(postid)开始选择行(也将是最新添加的行),并将响应的限制设置为10个不同的FK值。需要明确的是,我不想将行数限制设置为10,而只是设置明显的postid值的限制。

例如,如果我有下表:

+----------+--------+-----------+
| sequence | postid |   text    |
+----------+--------+-----------+
|    1     |   50   | 'Bla bla' |
|    1     |   51   | 'Bla bla' |
|    1     |   52   | 'Bla bla' | (1)  <-- From here (52 to 61 is 10 different postids)
|    2     |   52   | 'Bla bla' | (2)
|    1     |   53   | 'Bla bla' | (3)
|    2     |   53   | 'Bla bla' | (4)
|    1     |   54   | 'Bla bla' | (5)
|    1     |   54   | 'Bla bla' | (6)
|    1     |   56   | 'Bla bla' | (7)
|    1     |   57   | 'Bla bla' | (8)
|    1     |   58   | 'Bla bla' | (9)
|    1     |   59   | 'Bla bla' | (10)
|    1     |   60   | 'Bla bla' | (11)
|    1     |   61   | 'Bla bla' | (12)  <-- To here
+----------+--------+-----------+

这里我想要底部的12行,因为它们的postid从61变为52,包括52,即10。括号中的数字只是为了说明我想要选择多少行。

我希望这并不是太令人困惑:)所以有没有简单有效的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

SELECT * 
FROM mytable a 
INNER JOIN  ( SELECT DISTINCT(postid) postid 
              FROM mytable  
              ORDER BY postid DESC LIMIT 10) b  
ON a.postid = b.postid

答案 1 :(得分:1)

在以下查询中INNER JOIN将您的主表添加到临时表中,该表获取(最多)10个最高postid值。这允许您仅保留原始表中具有10个最高postid值之一的记录。您想要的记录将被过滤掉,因为它们与临时表中的任何内容都不匹配。

SELECT t1.sequence, t1.postid, t1.text
FROM table t1 INNER JOIN
(
    SELECT DISTINCT postid
    FROM table
    ORDER BY postid DESC
    LIMIT 10
) t2
ON t1.postid = t2.postid