【问题标题】:Select rows where top n values of a certain column are distinct选择某一列的前 n 个值不同的行
【发布时间】:2015-09-09 22:24:02
【问题描述】:

我想知道是否有可能在 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。括号中的数字只是为了说明我想选择多少行。

我希望这不会太令人困惑 :) 那么有没有简单有效的方法来做到这一点?

【问题讨论】:

    标签: mysql sql


    【解决方案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
    

    【讨论】:

    • WHERE IN (postids)
    【解决方案2】:
    SELECT * 
    FROM mytable a 
    INNER JOIN  ( SELECT DISTINCT(postid) postid 
                  FROM mytable  
                  ORDER BY postid DESC LIMIT 10) b  
    ON a.postid = b.postid
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2018-11-19
      • 2020-09-29
      相关资源
      最近更新 更多