【问题标题】:selecting top 3 rows in an ordered select在有序选择中选择前 3 行
【发布时间】:2011-06-02 17:50:46
【问题描述】:

我有这样的表格数据:

id,time,otherdata
a,1,fsdfas
a,2,fasdfag
a,3,fasdfas
a,7,asfdsaf
b,8,fasdf
a,8,asdfasd
a,9,afsadfa
b,10,fasdf
...

所以本质上,我可以按我想要的顺序选择所有数据,方法是:

select * from mytable ordered by id,time;

所以我按照我想要的顺序获取所有记录,首先按 id 排序,然后按时间排序。但不是获取所有记录,我需要每个 id 的最新 3 次。

答案:

嗯,我想出了怎么做。我对它的速度感到惊讶,因为我正在处理几百万行数据并且花了大约 11 秒。我在 sql 脚本中编写了一个过程来执行此操作,这就是它的样子。 --注意,不是获取最后3个,而是获取最后“n”行数据。

use my_database;

drop procedure if exists getLastN;
drop table if exists lastN;

-- Create a procedure that gets the last three records for each id
delimiter //
create procedure getLastN(n int)
begin
  # Declare cursor for data iterations, and variables for storage
  declare idData varchar(32);
  declare done int default 0;
  declare curs cursor for select distinct id from my_table;
  declare continue handler for not found set done = 1;
  open curs;

  # Create a temporary table to contain our results
  create temporary table lastN like my_table;

  # Iterate through each id
  DATA_LOOP: loop

  if done then leave DATA_LOOP; end if;
  fetch curs into idData;
  insert into lastThree select * from my_table where id = idData order by time desc limit n;

  end loop;
end//

delimiter ;
call getLastN(3);
select * from lastN;

很抱歉,如果这不完全有效,我不得不更改变量名称和其他东西来混淆我的工作,但我运行了这段确切的代码并得到了我需要的东西!

【问题讨论】:

    标签: mysql sql-order-by limit greatest-n-per-group


    【解决方案1】:

    我认为这很简单:

    SELECT * FROM `mytable`
    GROUP BY `id`
    ORDER BY `time` DESC
    LIMIT 3
    

    【讨论】:

    • 啊,我明白了。人们总是想要这样奇怪的东西:P
    【解决方案2】:

    我知道的两种方法是 (1) 使用一组联合,每个联合都包含一个“限制 3”,或 (2) 使用临时变量。这些方法以及其他有用的链接和讨论可以在here 找到。

    【讨论】:

      【解决方案3】:

      试试这个:

      select *
      from mytable as m1
      where (
         select count(*) from mytable as m2
         where m1.id = m2.id
      ) <= 3 ORDER BY id, time
      

      【讨论】:

      • 这是一个开始......但该查询并不完全有效。我会接受这个想法,看看我能不能让它发挥作用。
      猜你喜欢
      • 2014-01-03
      • 2016-09-13
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 2011-05-24
      • 1970-01-01
      相关资源
      最近更新 更多