需要在书中获得最新章节

时间:2014-10-24 05:23:50

标签: mysql sql greatest-n-per-group

我在MySQL数据库中有一个包含以下列的表。

Chapters
   Columns:
     id int(11) AI PK 
     title varchar(100) 
     text varchar(10000) 
     created datetime 
     revision int(11) 
     book_id int(11)

每本书(book_id)可以有多个章节。每章可以有多个修订版。我试图获取一个查询,该查询返回每本书每章的最新版本。我已经做到了,但它并没有做我想做的事。

select max(id), title, text, min(created), max(revision) 
from chapters
group by book_id, title;

它获取了最大修订号,修订版的正确ID以及最初创建章的时间。但是,本章的内容不是最新修订版的文本。我可以看出为什么会这样,但我不知道如何修复它以获得我想要的东西。任何帮助将不胜感激。

根据以下答案,我得到了以下查询的想法。

select id, title, text, revision, created, book_id
from chapters
where id in (select max(id)
             from chapters
             group by book_id, title)

现在这得到了我想要的信息,除了一件事。此查询中创建的字段是创建该章的最新修订版的日期。这不是一件糟糕的信息,我不介意保留它。但是,我还需要每章最早修订的创建日期。

我们说我有以下数据。

id,  title,  text,  revision, created,    book_id
-------------------------------------------------
1 | Chpt 1 | Blah  | 1      | 23/2/2014 | 1
-------------------------------------------------
2 | Chpt 2 | Blah2 | 1      | 24/2/2014 | 1
-------------------------------------------------
3 | Chpt 1 | Blah3 | 2      | 25/2/2014 | 1
-------------------------------------------------
4 | Chpt 1 | Blah4 | 1      | 26/2/2014 | 2
-------------------------------------------------
5 | Chpt 3 | Blah5 | 1      | 27/2/2014 | 1
-------------------------------------------------
6 | Chpt 1 | Blah6 | 3      | 28/2/2014 | 1

运行查询后,我希望关注以下数据。

id,  title,  text,  revision, created,    rev_date,  book_id
------------------------------------------------------------
6 | Chpt 1 | Blah6 | 3      | 23/2/2014 | 28/2/2014 | 1
------------------------------------------------------------
2 | Chpt 2 | Blah2 | 1      | 24/2/2014 | 24/2/2014 | 1
------------------------------------------------------------
5 | Chpt 3 | Blah5 | 1      | 27/2/2014 | 27/2/2014 | 1
------------------------------------------------------------
4 | Chpt 1 | Blah4 | 1      | 26/2/2014 | 26/2/2014 | 2
------------------------------------------------------------

安德鲁

**添加一些说明。

3 个答案:

答案 0 :(得分:1)

这样的事情应该有效。实际上,我们正在从您提到的标准中排序的数据中获得前1名结果。

select id, title, text, created, revision 
from chapters
order by id desc, created asc, revision desc
limit 1

答案 1 :(得分:1)

SELECT chapters.id, title, text, min_create, max_revision
FROM chapters INNER JOIN
(
    select book_id, max(id) AS max_id,
           MIN(created) AS min_create, MAX(revision) AS max_revision
    from chapters
    group by book_id
) max_tab ON chapters.id = max_tab.max_id;

答案 2 :(得分:1)

因为它是mysql,所以你可以这样做;

select * from (
    select * from chapters
    order by revision desc) x
group by book_id, title

这种非标准的分组功能是一个仅限mysql的技巧,虽然文档说你为每个组获得的实际行是非确定性的但实际上它是完全确定的:它始终是第一个遇到了一行。如果您先排序,然后分组(就像我一样),您将获得每本书每章的最新版本。