【问题标题】:MySQL get latest 3 rows for every id in where inMySQL 为 where in 中的每个 id 获取最新的 3 行
【发布时间】:2014-01-13 08:16:55
【问题描述】:

我有以下查询,据说它会为每个 update_id 获取最新的 3 个 cmets。它似乎有效,直到我发现一个逻辑问题,即不管更新它都会获得最新的 3 cmets;它应该为每个 update_id 获取最新的 3 cmets。我怎样才能做到这一点?显然 limit(3) 是错误的。

SELECT  `comms` . * ,  `usr`.`name` 
FROM (
`comms`
)
JOIN  `users` AS usr ON  `usr`.`id` =  `comms`.`user_id` 
WHERE  `update_id` 
IN (
'1451',  '1416',  '1186',  '1157',  '1150',  '1122',  '1057',  '914',  '850',  '816',  '794',  '790',  '749',  '746',  '745',  '744',  '740'
)
ORDER BY  `id` DESC 
LIMIT 3

【问题讨论】:

  • 如果你想要三个结果 LIMIT 3 怎么错了?
  • 因为我有 10 个更新,所以最新的 3 个将乘以 30 而不是 3。我想显示每个 update_id 的最新 3 个。
  • 尝试 ORDER BY update_id DESC 而不是 id

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


【解决方案1】:

试试这个:

SELECT A.*, u.name 
FROM (SELECT c.*, IF(@updateId = @updateId:=update_id, @idx:=@idx+1, @idx:=0) idx 
      FROM comms c, (SELECT @updateId:=0, @idx:=0) A
      WHERE update_id IN ('1451', '1416', '1186', '1157', '1150', '1122', '1057', '914', '850', '816', '794', '790', '749', '746', '745', '744', '740')
      ORDER BY update_id, id DESC   
    ) AS A 
INNER JOIN users AS u ON u.id = A.user_id
WHERE A.idx < 3

【讨论】:

  • 是的!!!!感谢您的提醒!这是很棒的解决方案,效果很好。真的很有帮助。
猜你喜欢
  • 2015-02-14
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
相关资源
最近更新 更多