【问题标题】:MySQL get the 2 last of each version in one tableMySQL 在一个表中获取每个版本的最后 2 个
【发布时间】:2017-12-17 20:23:36
【问题描述】:

我想检索进程的最后一个版本:

|编号 |姓名 |版本 |源ID | | 1 |测试1 | 1.00 | 0 | | 2 |测试1 | 1.01 | 1 | | 3 |测试1 | 1.02 | 1 | | 4 |测试1 | 1.03 | 1 | | 5 |测试2 | 1.00 | 0 | | 6 |测试2 | 1.01 | 4 | | 7 |测试2 | 1.02 | 4 | | 8 |测试3 | 1.00 | 0 |

预期的结果是:

|编号 |姓名 |版本 |源ID | | 3 |测试1 | 1.02 | 1 | | 4 |测试1 | 1.03 | 1 | | 6 |测试2 | 1.01 | 4 | | 7 |测试2 | 1.02 | 4 | | 8 |测试3 | 1.00 | 0 |

我已经编写了这个查询,但我不喜欢它...而且我不能将它作为子查询包含在 WHERE id IN (...) 中。 SELECT (SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY process_version DESC), ',', 2) FROM process WHERE process_name = parent.process_name) AS ids FROM process AS parent WHERE 1 GROUP BY process_name

【问题讨论】:

  • 您似乎需要最后 5 条记录。我说的对吗?
  • @mr.developer no

标签: mysql


【解决方案1】:

谢谢草莓! 只需稍作修正,我就有了我的要求(您的要求是提供 2 个第一个版本):

SELECT `x`.*, `y`.`id`
  FROM `my_table` AS `x`
  JOIN `my_table` AS `y`
    ON `y`.`name` = `x`.`name`
    AND `y`.`id` >= `x`.`id`
GROUP BY `x`.`id`
HAVING COUNT(*) <=2  
ORDER BY `x`.`name` ASC, `x`.`version` ASC

【讨论】:

  • 这个解决方案有缺陷。此外,如果您没有在收件人姓名中包含 @,那么他们将不会看到评论(就像我没有看到一样 - 直到现在)。
【解决方案2】:

例如

SELECT x.*
  FROM my_table x
  JOIN my_table y
    ON y.name = x.name
   AND y.id <= x.id
 GROUP
    BY x.id
 HAVING COUNT(*) <=2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 2015-05-16
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多