2012-11-27 81 views
3

我的問題與this one相當,但不完全相同。MySQL:當WHERE發現類似條目時,選擇最高列值

我有一個擁有大量書籍的數據庫,其中一些書籍的版本不同。我正在尋找一個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| 
|--|-------------------------|-------|----| 

我要找的結果是這樣的:

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

但它返回:

|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| 
|--|-------------------------|-------|----| 

我就是用這個說法最接近包括找到的第一個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; 

使用此我得到獨特的頭銜,但大多是舊版本。

+2

選擇b.id,b.title,b.edition,從書本b b.year其中b.edition =(從書籍b2中選擇max(b2.edition),其中b2.title = b.title) – wxyz

+0

+1 @wxyz:你爲什麼不把它作爲答案? – mpe

+0

輝煌!正是我在找什麼。 – Ack

回答

1

這裏是一個SQLFiddle example

在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 
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 with Demo

或者你可以使用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 with Demo

0

最簡單的方法:

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