3

我的问题与类似,但不完全相同。

我有一个包含大量书籍的数据库,其中一些相同书名的不同版本。我正在寻找一条 SQL 语句,它为我使用 WHERE 子句(以查找特定的丛书)提供我选择的每个标题的最高版本号。表格如下所示:

|id|title                    |edition|year|
|--|-------------------------|-------|----|
|01|Serie One Title One      |1      |2007|
|02|Serie One Title One      |2      |2008|
|03|Serie One Title One      |3      |2009|
|04|Serie One Title Two      |1      |2001|
|05|Serie One Title Three    |1      |2008|
|06|Serie One Title Three    |2      |2009|
|07|Serie One Title Three    |3      |2010|
|08|Serie One Title Three    |4      |2011|
|--|-------------------------|-------|----|

我正在寻找的结果是这样的:

|id|title                    |edition|year|
|--|-------------------------|-------|----|
|03|Serie One Title One      |3      |2009|
|04|Serie One Title Two      |1      |2001|
|08|Serie One Title Three    |4      |2011|
|--|-------------------------|-------|----|

我得到的最接近的是使用这个语句:

select id, title, max(edition), max(year) from books where title like "serie one%" group by title;

但它返回最高版本和年份,并包括它找到的第一个 id:

|--|-----------------------|-------|----|
|01|Serie One Title One    |3      |2009|
|04|Serie One Title Two    |1      |2001|
|05|Serie One Title Three  |4      |2011|
|--|-----------------------|-------|----|

这个花哨的连接也很接近,但没有给出正确的结果:

select b.id, b.title, b.edition, b.year from books b inner join (select name, max(edition) as maxedition from books group by title) g on b.edition = g.maxedition where b.title like "serie one%" group by title;

使用它,我得到了独特的标题,但大多是旧版本。

4

3 回答 3

2

您可以使用子查询:

select b1.id, 
  b1.title,
  b1.edition,
  b1.year
from books b1
inner join
(
  select max(edition) edition, title
  from books
  group by title
) b2
  on b1.edition = b2.edition
  and b1.title = b2.title

请参阅带有演示的 SQL Fiddle

或者你可以使用一个IN子句:

select id, title, edition, year
from books b
where edition in (select max(edition)
                  from books b1
                  where b.title = b1.title
                  group by title);

请参阅带有演示的 SQL Fiddle

于 2012-11-27T12:06:59.980 回答
1

这是一个SQLFiddle 示例

在 MySql 中,您可以这样做:

select id,title,edition,year from
(
      select id,title,edition,year,
      @i:=if(@title=title,@i+1,1) rn,
      @title:=title 
      from t, (select @i:=0,@title:='') d 
      order by title,edition Desc,year desc
) d where rn=1
于 2012-11-27T11:27:28.227 回答
0

最简单的方法:

select * from (select id, title, edition, year from books order by title, edition desc) group by title;

于 2014-10-31T05:24:11.100 回答