MySQL:当 WHERE 找到相似条目时选择最高列值
Posted
技术标签:
【中文标题】MySQL:当 WHERE 找到相似条目时选择最高列值【英文标题】:MySQL: SELECT highest column value when WHERE finds similar entries 【发布时间】:2012-11-14 23:43:52 【问题描述】:我的问题类似于this one,但不完全相同。
我有一个包含大量书籍的数据库,其中一些相同书名的不同版本。我正在寻找一条 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;
使用它,我得到了独特的标题,但大多是旧版本。
【问题讨论】:
从书籍 b 中选择 b.id、b.title、b.edition、b.year,其中 b.edition = (从书籍 b2 中选择 max(b2.edition),其中 b2.title = b。标题) +1 @wxyz:你为什么不添加这个作为答案? 太棒了!正是我想要的。 【参考方案1】:您可以使用子查询:
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
【讨论】:
【参考方案2】:这是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
【讨论】:
【参考方案3】:最简单的方法:
select * from (select id, title, edition, year from books order by title, edition desc) group by title;
【讨论】:
以上是关于MySQL:当 WHERE 找到相似条目时选择最高列值的主要内容,如果未能解决你的问题,请参考以下文章
有一个 mySQL 错误,未知列 where 子句 [重复]
My SQL with Python:选择具有最高值的行并在那里更改值