我有一张“歌曲”表,就像这样
艺术家 | 标题 | 位置 | 日期 |
---|---|---|---|
艺术家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 中止了!
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