从列表中找到最小值

问题描述 投票:0回答:1

我有一张“歌曲”表,就像这样

艺术家 标题 位置 日期
艺术家1 标题1 1 1980 年 1 月 1 日
艺术家2 标题0 9 1980 年 1 月 1 日
艺术家3 标题2 3 1980 年 1 月 1 日
艺术家1 标题1 1 1980 年 1 月 7 日
艺术家2 标题0 5 1980 年 1 月 7 日
艺术家3 标题2 4 1980 年 1 月 7 日
艺术家1 标题1 3 1980 年 1 月 14 日
艺术家2 标题0 6 1980 年 1 月 14 日
艺术家3 标题2 2 1980 年 1 月 14 日

我正在尝试按 Pos 的最低值对每首歌曲(标题和艺术家)进行分组,这样我最终会得到

艺术家 标题 位置 日期
艺术家1 标题1 1 1980 年 1 月 1 日
艺术家2 标题0 5 1980 年 1 月 7 日
艺术家3 标题2 2 1980 年 1 月 14 日

如果获取每首歌曲“GROUP by Artist, Title”的 select 语句也能获得最低的 Pos 值,那就太高效了。

我尝试使用一个单独的 select 语句,在查找每首歌曲的 while 循环中找到每首歌曲的每个最低 Pos 值。例如

第一个选择语句 从歌曲中选择 *,其中日期 > $yearstart AND 日期 < $yearend Group BY Artist, Title ORDER BY Artist

然后从 while 循环中 从单曲中选择位置、日期,其中艺术家 = '".$row['Artist']."' AND 标题 = '".$row['Title']."' ORDER BY Date";

这工作得很好(对于大约 600 首歌曲),因为第一个 select 语句在某些情况下会检查 10,000 行,而第二个语句会再次检查所有 10,000 行,以确定每首歌曲的最低 Pos 值。显然这效率很低,以至于 MySQL 中止了!

group-by min
1个回答
0
投票
Select s.Artist, s.Title, s.Pos, s.Date
from Songs s
inner join 
  ( SELECT artist, title, min(pos) as minPos 
    FROM songs 
    WHERE Date > $yearstart AND Date < $yearend 
    Group BY Artist, Title) m 
  on s.Artist = m.Artist and
     s.Title = m.Title and
     s.Pos = m.minPos
WHERE s.Date > $yearstart AND Date < $yearend
ORDER BY s.Artist
© www.soinside.com 2019 - 2024. All rights reserved.