【问题标题】:Query Select Database MySQL showing songs with all Genres (Categories)查询选择数据库 MySQL 显示所有流派(类别)的歌曲
【发布时间】:2020-05-22 10:01:15
【问题描述】:

首先,我不擅长英语。所以请原谅我。

这是我的数据库

songs: id, songname, songpath, coverpath
genre : id, genrename
detail_genre : id, id_song, id_genre

我的 SONGS 表内容示例:

1, Kasbo - Aldrig Mer, songs/kasbo.mp3, cover/kasbo.jpg
2, Pamungkas - One Only, songs/oneonly.mp3, cover/oneonly.jpg

我的 GENRE 表内容示例:

1, Electronic Dance Music
2, Pop
3, Indie

我的 DETAIL_GENRE 表内容示例:

1, 1, 1
2, 2, 3
3, 2, 2

因此,您会注意到每一首歌曲都可以有多种流派。

我想要 SELECT 查询(songid、songname、songpath、coverpath、group of (id_genre)、group of (genre_name))。所以结果会是这样的

1, Kasbo - Aldrig Mer, songs/kasbo.mp3, cover/kasbo.jpg, 1, Electronic Dance Music
2, Pamungkas - One Only, songs/oneonly.mp3, cover/oneonly.jpg, (2,3), (Pop, Indie)

或者只是(songid、songname、songpath、coverpath、group of (id_genre))

1, Kasbo - Aldrig Mer, songs/kasbo.mp3, cover/kasbo.jpg, 1
2, Pamungkas - One Only, songs/oneonly.mp3, cover/oneonly.jpg, (2,3)

我试过这样选择

SELECT * FROM detail_genre dg JOIN genre g ON dg.id_genre = g.id JOIN songs s ON dg.id_song = s.id GROUP BY g.id

但如果某个流派有很多歌曲,它只会显示他们找到的第一首歌曲。

可以帮助我的人获得我想要的 SELECT QUERY 吗?我是新手。之前谢谢。

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    songs 开始连接并使用LEFT 连接到其他表,以防一首歌没有任何流派(如果所有歌曲的流派都更改为INNER 连接)。
    然后按歌曲分组并使用GROUP_CONCAT() 为流派创建逗号分隔列表:

    SELECT s.id, s.songname, s.songpath, s.coverpath, 
           GROUP_CONCAT(g.id ORDER BY g.id) genre_ids,
           GROUP_CONCAT(g.genrename ORDER BY g.id) genre_names
    FROM songs s
    LEFT JOIN detail_genre dg ON dg.id_song = s.id 
    LEFT JOIN genre g ON g.id = dg.id_genre
    GROUP BY s.id, s.songname, s.songpath, s.coverpath
    

    或者先在detail_genre的join内聚合到genre再join到songs

    SELECT s.id, s.songname, s.songpath, s.coverpath,
           t.genre_ids, t.genre_names
    FROM songs s
    LEFT JOIN (
      SELECT dg.id_song, 
             GROUP_CONCAT(g.id ORDER BY g.id) genre_ids,
             GROUP_CONCAT(g.genrename ORDER BY g.id) genre_names
      FROM detail_genre dg INNER JOIN genre g 
      ON g.id = dg.id_genre
      GROUP BY dg.id_song
    ) t ON t.id_song = s.id 
    

    【讨论】:

    • 谢谢,但它显示了致命错误:未捕获的类型错误:htmlspecialchars() 期望参数 1 为字符串,给定为空
    • 这不是 MySql 错误。我已经纠正的唯一错字是第二个查询中缺少逗号。
    • hm 我试过你的第二个查询,但错误是一样的
    • 您得到的错误是php错误,与我回答中的查询无关。
    • 是的,我也是,我找不到您的查询错误。好的,谢谢兄弟的帮助,我再试一次
    猜你喜欢
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多