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 に答える