0

我对在 SQL 中使用 group by 和聚合函数比较陌生,我有以下表格:

CREATE TABLE `artists` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR( 100 ) NOT NULL ); 
CREATE TABLE `genres` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR( 100 ) NOT NULL); 
CREATE TABLE `songs` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR( 100 ) NOT NULL, `artist_id` INT NOT NULL ); 
CREATE TABLE `songs_genres` (`song_id` INT NOT NULL, `genre_id` INT NOT NULL );

我希望返回拥有多种类型歌曲的艺术家。欢迎任何想法!

到目前为止,我已经将所有内容链接在一起,但无法完全确定所需的分组/聚合:

select a.name as name, g.name as genre 
from artists a inner join songs s on a.id = s.artist_id
inner join songs_genres sg on s.id = sg.song_id
inner join genres g on g.id = sg.genre_id

提前致谢。

4

2 回答 2

0

这可能会有所帮助。它将找到有多少流派有多个艺术家:

SELECT COUNT(a.Name) AS "No. of Artists",
       g.Name AS "Genre"
FROM Artists a
INNER JOIN songs s on a.id = s.artist_id
INNER JOIN songs_genres sg on s.id = sg.song_id
INNER JOIN genres g on g.id= sg.genre_id
GROUP BY g.Name

这将为您提供每位艺术家的流派数量:

SELECT COUNT(g.Name) AS "No. of Genres",
           a.Name AS "Artist"
FROM Artists a
INNER JOIN songs s on a.id = s.artist_id
INNER JOIN songs_genres sg on s.id = sg.song_id
INNER JOIN genres g on g.id= sg.genre_id
GROUP BY a.Name

添加一个HAVING子句将允许您将结果缩小到那些数量超过任何数量的艺术家/流派:

SELECT COUNT(g.Name) AS "No. of Genres",
               a.Name AS "Artist"
    FROM Artists a
    INNER JOIN songs s on a.id = s.artist_id
    INNER JOIN songs_genres sg on s.id = sg.song_id
    INNER JOIN genres g on g.id= sg.genre_id
    GROUP BY a.Name
HAVING Count(g.Name) > 1 -- or 2, or 10. This will skip over single-genre artists

您在这些查询中所做的是计算给定值在按另一个值分组时出现的次数。

于 2015-02-13T22:00:49.923 回答
0

您可以通过文档http://www.w3schools.com/sql/sql_groupby.asp检查组,但我认为您可以执行以下操作

    select a.name as name, g.name as genre 
    from artists a inner join songs s on a.id = s.artist_id
    inner join songs_genres sg on s.id = sg.song_id
    inner join genres g on g.id = sg.genre_id
    group by name, genre desc

我希望这会有所帮助,您也可以在多个列上使用 group by检查此威胁

于 2015-02-13T22:01:55.797 回答