![](/img/trans.png)
[英]How to get a one-to-many result when the MySQL query is based on a second relationship in the related table?
[英]How can I return all relationship data in one mysql query and stop only one result being concatanated when querying by relationship
我正在尝试执行 MYSQL 查询,该查询检索关系数据并将其连接到 json 对象的串联字符串中,我稍后会对其进行 json_decode。
我在这里设置了一个小提琴,但 JSON_OBJECT 不起作用。 架构在 markdown 表中或下方。
我想要达到的最终结果是下表中的结果。
ID | 标题 | 发布日期 | 艺术家 | 流派 |
---|---|---|---|---|
1 | 我的歌 | 2022-01-01 15:00:01 | [{id: 1, name: 'Pauli', is_featuring: 0}, {id: 2, name: 'Tony', is_featuring: 1}] | [{id:1,名称:'Rock'},{id:2,名称:'Pop'}] |
下面是使用艺术家 ID 根据艺术家检索歌曲的查询。 我得到了一个歌曲列表,但如果歌曲中有多个艺术家,它只返回其 id 传递给 sql 查询的艺术家。
当尝试按流派查询时会发生类似的事情。
所以我的问题是如何在结果中返回我想要的数据,同时对艺术家或流派进行查询? 我还必须计算查询将返回的结果总数的总记录数。
SELECT ms.id, ms.title, ms.date_published,
CONCAT('[', GROUP_CONCAT(DISTINCT(JSON_OBJECT('id', ma.id, 'name', ma.name, 'is_featuring', mas.is_featuring_artist)) ORDER BY mas.id separator ','), ']') AS artists,
CONCAT('[', IF(mg.id IS NULL, '', GROUP_CONCAT(DISTINCT(JSON_OBJECT('id', mg.id, 'name', mg.name)) ORDER BY mg.name separator ',')), ']') AS genres
FROM songs ms
LEFT JOIN artist_song mas ON mas.song_id = ms.id
LEFT JOIN artists ma ON ma.id = mas.artist_id
LEFT JOIN genre_song mgs ON mgs.song_id = ms.id
LEFT JOIN genres mg ON mg.id = mgs.genre_id
WHERE ma.id = 2 AND ms.published = 1
GROUP BY ms.id
ORDER BY ms.date_published DESC
LIMIT 10
OFFSET 0;
这是我要回来的结果。 请注意,当我查询 id 为 2 的艺术家时,艺术家 Pauli 不再在艺术家数组中。
ID | 标题 | 发布日期 | 艺术家 | 流派 |
---|---|---|---|---|
1 | 我的歌 | 2022-01-01 15:00:01 | [{id: 2, name: 'Tony', is_featuring: 1}] | [{id:1,名称:'Rock'},{id:2,名称:'Pop'}] |
下面是表格
歌曲表
ID | 姓名 | 发表 |
---|
艺术家表
ID | 姓名 |
---|
艺术家歌曲表
ID | 艺术家 ID | 歌曲编号 | is_featured |
---|
流派表
ID | 姓名 |
---|
流派歌曲表
ID | 流派_id | 歌曲编号 |
---|
你需要加入artist_song
两次。 其中一个限制选择的歌曲,另一个是让所有艺术家都上这首歌。
SELECT ms.id, ms.title, ms.date_published,
CONCAT('[', GROUP_CONCAT(DISTINCT(JSON_OBJECT('id', ma.id, 'name', ma.name, 'is_featuring', mas.is_featuring_artist)) ORDER BY mas.id separator ','), ']') AS artists,
CONCAT('[', IF(mg.id IS NULL, '', GROUP_CONCAT(DISTINCT(JSON_OBJECT('id', mg.id, 'name', mg.name)) ORDER BY mg.name separator ',')), ']') AS genres
FROM songs ms
JOIN artist_song mas1 ON mas1.song_id = ms.id
JOIN artist_song mas ON mas.song_id = ms.id
JOIN artists ma ON ma.id = mas.artist_id
LEFT JOIN genre_song mgs ON mgs.song_id = ms.id
LEFT JOIN genres mg ON mg.id = mgs.genre_id
WHERE mas1.artist_id = 2 AND ms.published = 1
GROUP BY ms.id
ORDER BY ms.date_published DESC
LIMIT 10
OFFSET 0;
无需两次加入artists
,因为在限制时您没有使用该表中的任何内容。 您可以从mas1.artist_id
限制艺术家 ID。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.