繁体   English   中英

如何在一个 mysql 查询中返回所有关系数据,并在按关系查询时停止仅连接一个结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM