我正在使用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.
答案 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;