2014-10-17 76 views
0

我在我的数据库中的两个表:
使用GROUP BY获取结果

song => id, name, song_ref, views 
artist => id, name 

我想从歌曲表为每一个观看最多的歌曲获取所有艺术家。
我试图使用MAX(views)来获取最大视图值,但没有成功获取该相关歌曲的其他字段。

SELECT a.name, MAX(s.views) FROM song s inner join artist a 
ON s.artist_ref = a.idArtist GROUP BY a.name 

有什么想法吗?谢谢

+0

您是否考虑过将所需的列添加到SELECT子句中? – DaveCoast 2014-10-17 01:57:02

+0

是的,它会显示一个与最大视图无关的随机结果 – Rawhi 2014-10-17 01:59:24

回答

2

试试这个:

SELECT * 
FROM 
    (SELECT a.id AS aid, 
      a.name AS artist, 
      s.id AS sid, 
      s.name AS most_viewed, 
      s.views 
    FROM artist a 
    INNER JOIN song s ON s.artist_ref=a.id 
    ORDER BY a.id, 
      s.views DESC) c 
GROUP BY c.aid; 
+0

完美,,非常感谢你 – Rawhi 2014-10-17 09:16:41

1

我的第一个回答是不正确的。这里是一个可行的修订版:

SELECT a.idArtist AS aid, a.name, s.id AS sid, s.views 
FROM artist a INNER JOIN song s ON a.idArtist = s.artist_ref 
INNER JOIN (SELECT MAX(views) AS views, artist_ref FROM song GROUP BY artist_ref) max_songs 
ON s.artist_ref = max_songs.artist_ref AND s.views = max_songs.views 
ORDER BY a.name 
+0

它可以工作,但没有返回观看次数最多的歌曲。 – Rawhi 2014-10-17 01:53:57

0

试试这个..

SELECT a.name, 
(SELECT s.views FROM song s WHERE s.name=a.name 
ORDER BY s.views DESC LIMIT 0,1) as `views` 
FROM artist a 
0

这是否小提琴返回正确的值(编辑小提琴链接名称和包括工作SQL语句,该语句返回具有最多观看歌曲的行的关联列)。

Link to Fiddle

它演示与测试数据下面的SQL语句。

SELECT a.Name, a.songRef, Views, aName FROM artist b 
INNER JOIN song a on a.Name = b.aName 
    WHERE Views = 
     (SELECT MAX(Views) from Song as z 
     WHERE z.Name = b.aName) GROUP BY a.name, b.aName, a.songRef 
+0

这并没有提供一个问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – mrt 2014-10-17 03:37:04

+0

@mrt您是否遵循指向小提琴的链接并确定它与底座基本相关,或者超链接文本是“带MAX(视图)的GROUP BY示例”,这很容易被解释为无价值的SQL语句。答案已被编辑。 – DaveCoast 2014-10-17 04:08:36

+0

当然,我做到了。无论如何,现在你编辑了你的答案,我的投诉不再有效。 ;) – mrt 2014-10-17 04:45:58