mysql - 如何在MySql中进行多对多子查询

标签 mysql sql

我正在使用 MySql 5.1 并正在构建我的第一个多对多数据库。我理解这些概念,我有 3 个表:

  • 相册,具有唯一 ID
  • 流派,具有唯一 ID
  • album_genres 包含专辑和流派中每个 ID 的列。

我遇到的问题是,一张专辑当然可以有多种流派。但当我进行搜索时,我对如何构建它一无所知,因此在搜索过程中,我得到了每张专辑的所有流派。请注意,这不是加载 1 个专辑,而是进行搜索以获取 1 个或多个专辑。

抱歉,我没有任何东西可以展示我所尝试过的内容,因为我什至不知道从哪里开始。

我确信这很容易。但我能找到的所有教程都只涉及 M2M 的基础知识,而不涉及如何获取多个匹配条目。

在查看了许多很棒的建议后,我构建了这个查询:

SELECT 
album.album_title,
Concat(genre.genre_id, ',') as GenreName, 
count(album.album_id) as GenreCount
FROM $this->album_tbl album
JOIN wp_musicmgr_albgnr albgnr ON albgnr.albgnr_album_fk = album.album_id
JOIN $this->genre_tbl genre ON genre.genre_id = albgnr.albgnr_genre_fk
GROUP BY album.album_id

哪个产生了这个:

[0] => stdClass Object
    (
        [album_title] => album q
        [GenreName] => 1,
        [GenreCount] => 3
    )

However, as you can see. Despite having a count of 3 hits on genres, it is listing the first one.

最佳答案

如果我遇到问题,你需要像这样的输出

AlbumName  | Genre1,Genre2.........

为此,您需要使用GroupBy

SELECT A.album_name as AlbumName, GROUP_CONCAT(G.genre_name) as GenreName, count(A.ID) as GenreCount  
FROM Album A 
JOIN album_genres AG 
   ON (A.ID = AG.album_ID)
JOIN Genre G
   ON (G.ID = AG.genre_ID)
Group by A.ID

关于mysql - 如何在MySql中进行多对多子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20415101/

相关文章:

sql - 每次在 SQL Server 中更新或插入行时,我都想获取当前日期时间

sql - 如何将 sql 查询的输出读入 ant 属性?

php - 将 PHP 连接到 MySQL。我的电脑安装了2个MySQL。连接哪一个

MySQL : Left join with group by records

python - sqlalchemy.exc.NoSuchColumnError : "Could not locate column in row for column ' 0'"

android - 什么是 MINI_THUMB_MAGIC 以及如何使用它?

sql - 在SQLite中评估连续的行对

mysql - SQL Left Join 但不希望左表中的所有记录

mysql - 删除除最新 5 条以外的所有记录

javascript - 未捕获的语法错误 : Unexpected token D in JSON at position 0