MySQL - 在嵌套语句中选择最大修订版

时间:2016-09-05 16:20:35

标签: mysql

我想从mysql表中选择最大修订图纸。 我不能使用嵌套的select语句(?)(所有条件应该在'SELECT * FROM drawings'之后)。

所以,'drawings'表是:

+----+---------+-------------+-------+---------+---------------------+
| id | number  | title       |format | revision| date                |
+----+---------+-------------+-------+---------+---------------------+
| 100|  022588 |  some title | dwg   | 1       | 2016-01-07 08:00:00 |
| 101|  022588 |  some title | dwg   | 2       | 2016-01-07 08:01:00 |
| 103|  022588 |  some title | pdf   | 3       | 2016-01-07 08:15:32 |
| 104|  022588 |  some title | dwg   | 3       | 2016-01-07 09:10:32 |
+----+---------+-------------+-------+---------+---------------------+

我想得到的结果是(相同数字,适当格式的最大修订版):

| 103|  022588 |  some title | pdf   | 3       | 2016-01-07 08:15:32 |
| 104|  022588 |  some title | dwg   | 3       | 2016-01-07 09:10:32 |

再一次,我(必须)用'SELECT * FROM drawings WHERE ......'开始查询。

我尝试的最后一件事是:

SELECT * FROM `drawings` WHERE `revision` IN ( SELECT MAX(`revision`) FROM `drawings` GROUP BY `number`, `format` ) GROUP BY `number`, `format` ORDER BY `number` DESC;

...我得到了一个合适的pdf和错误/最低dwg(1而不是3)。

4 个答案:

答案 0 :(得分:2)

如果我正确地阅读了您的问题,那么您希望从每个format组中获取具有该组中最大修订号的图纸。一种方法使用子查询来标识格式及其最大修订,然后使用该子查询来限制原始drawings表。

SELECT t1.*
FROM drawings t1
INNER JOIN
(
    SELECT format, MAX(revision) AS revision
    FROM drawings
    GROUP BY format
) t2
    ON t1.format = t2.format AND
       t1.revision = t2.revision

请按照以下链接查看正在运行的演示:

SQLFiddle

答案 1 :(得分:2)

您可以在WHERE子句中使用核心子查询:

SELECT d1.*
FROM `drawings` d1
WHERE `revision` = (
    SELECT MAX(`revision`)
    FROM `drawings` d2
    WHERE d2.`number` = d1.`number`
      AND d2.`format` = d1.`format`
) 
ORDER BY `number` DESC;

See it on SQLFiddle

对于具有最高版本的numberformat的每个组合,查询将返回一行。我使用该组合是因为您的原始查询:GROUP BY number, format。但你也写道:"适当格式的最大修订版"。在这种情况下,您应该使用:

SELECT d1.*
FROM `drawings` d1
WHERE `revision` = (
    SELECT MAX(`revision`)
    FROM `drawings` d2
    WHERE d2.`format` = d1.`format`
) 
ORDER BY `number` DESC;

答案 2 :(得分:1)

我建议:

从图纸d1中选择d1。* 其中d1.id in(    从d2.format中选择图纸d2组中的最大值(d2.id) )

使用PrimaryKey的查询速度更快。并且您获得了最后一次修订记录。

答案 3 :(得分:-1)

这是查询:

select *
from drawings a inner join (select number, title, format, 
                            max(revision) as revision
                            from drawings 
                            group by number, title, format) b 
on a.number = b.number and a.title = b.title and a.format = b.format
and a.revision = b.revision