如何在MySql中执行多对多子查询

时间:2013-12-06 02:58:50

标签: mysql sql

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

  • Albums,具有唯一ID
  • Genres,具有唯一ID
  • album_genres,其中包含来自相册和流派的每个ID的列。

我遇到的问题是,当然,1张专辑可以有多种类型。但是当我进行搜索时,我真的很不知道如何构建它,所以在搜索过程中,我会得到每个单独专辑的所有类型。请注意,这不是加载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.

5 个答案:

答案 0 :(得分:0)

加入这两张桌子。

SELECT cols FROM Albums
JOIN album_genres USING (albumID)
JOIN Genres USING (genreID)
WHERE albumName LIKE :search

答案 1 :(得分:0)

要获取相册的所有类型,查询将是

SELECT A.album_name, G.genre_name FROM Album A 
JOIN album_genres R 
    ON (A.ID = R.album_ID)
JOIN Genre G
    ON (G.ID = R.genre_ID)

WHERE A.ID = '5'

其中5将是专辑的唯一ID。基本概念是你应该加入3个表,并使用JOIN - ON将关系表中每列的id与实体表一匹配

编辑:如果你想要一张每个类型的专辑列表,就像这样:

专辑 - 流派

Al01 - Rock

Al02 - Rock

Al01 - Rock

Al01 - 金属

Al03 - 金属

只需删除WHERE A.ID = '5'即可。

答案 2 :(得分:0)

从相册a,流派g,album_genres ag中选择* 其中a.unique_id = ag.a_unique_id和g.unique_id = ag.g_unique_id和a.name如'% 专辑名称 %'

相册名称 是表相册

中相册的值

也代替 选择* 中的星标(*),请从Gener表格中输入列名称。

答案 3 :(得分:0)

如果我得到了问题,你需要输出

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

答案 4 :(得分:0)

更新(新答案):

注意:经过测试。

select a.name, group_concat(g.name separator ', ') 
from albums a 
inner join album_genre ag on a.id = ag.albumid 
inner join genres g on ag.genreid = g.id 
group by a.id;


注意:GROUP_CONCAT具有最大长度限制。默认限制为1024,但可以通过修改group_concat_max_len来更改。阅读更多:http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

旧答案:

搜索相册:

SELECT a.album_name, a.AlbumId FROM `Albums` a 
INNER JOIN `album_genres` ag on a.AlbumId = ag.AlbumId
INNER JOIN `Genres` g on ag.GenreId = g.GenreId
WHERE 
a.album_name = 'Michael Learns To Dance' AND
g.genre_name = 'ROCK'
GROUP BY a.AlbumId;

Foreach行...执行另一个搜索查询:

SELECT g.genre_name FROM `Genres` g
INNER JOIN `album_genres` ag on g.GenreId = ag.GenreId
WHERE ag.AlbumId = 1;

.... [续下一行] ....

....
WHERE ag.AlbumId = 2;
WHERE ag.AlbumId = 3;
WHERE ag.AlbumId = 4;
......
WHERE ag.AlbumId = 1000;