SQL - return 条具有多个类别的记录
SQL - return records with multiple categories
我对在 SQL 中使用分组依据和聚合函数比较陌生,我有下表:
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 );
我正在寻找 return 拥有多种流派歌曲的艺术家。欢迎任何想法!
到目前为止,我已经link 将所有内容放在一起,但无法完全计算出所需的分组/聚合:
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
提前致谢。
这可能会有所帮助。它将找到有多少流派有多个艺术家:
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
子句将允许您将结果缩小到 Artists/Genres 超过任何数字的结果:
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
您在这些查询中所做的是计算当按另一个值分组时给定值出现的次数。
您可以通过文档检查组 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
希望对您有所帮助,您也可以查看此威胁Using group by on multiple columns
我对在 SQL 中使用分组依据和聚合函数比较陌生,我有下表:
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 );
我正在寻找 return 拥有多种流派歌曲的艺术家。欢迎任何想法!
到目前为止,我已经link 将所有内容放在一起,但无法完全计算出所需的分组/聚合:
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
提前致谢。
这可能会有所帮助。它将找到有多少流派有多个艺术家:
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
子句将允许您将结果缩小到 Artists/Genres 超过任何数字的结果:
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
您在这些查询中所做的是计算当按另一个值分组时给定值出现的次数。
您可以通过文档检查组 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
希望对您有所帮助,您也可以查看此威胁Using group by on multiple columns