mysql 一对多+多对多表的SQL查询

q8l4jmvw  于 2023-06-28  发布在  Mysql
关注(0)|答案(1)|浏览(159)

我有四张table。
用户
| 电子邮件| email |
| - -----| ------------ |
| www.example.com |b@mail.com|
| www.example.com |a@mail.com|
团队介绍
| 标题|俱乐部| club |
| - -----|- -----| ------------ |
| u7|一个| 1 |
| U8|一个| 1 |
团队_用户
| 用户id| user_id |
| - -----| ------------ |
| 一个| 1 |
| 一个| 1 |
俱乐部
| 标题| title |
| - -----| ------------ |
| 曼彻斯特| manchester |
| 马德里| madrid |
我想写一个查询,它返回所有用户,只显示他们的电子邮件(他们有其他列)和与此用户相关的球队(如果可能的话,在数组中)和一个特定的俱乐部。我想每个用户一行。我要各队的所有资料。我想找回没有相关团队的用户。
这可能吗?
到目前为止,这是我的代码:

SELECT u.email, u.first_name, u.last_name, GROUP_CONCAT(team.title)
FROM user u
LEFT JOIN team_user
    ON team_user.user_id = u.id
LEFT OUTER JOIN team
    ON team.club_id = u.club_id and team_user.team_id = team.id
GROUP BY email, first_name, last_name

但这只返回以逗号分隔的方式显示的团队名称。我可以在数组或对象中取回其他字段和吗?

dxxyhpgq

dxxyhpgq1#

一个选项使用JSON ;我们可以为每个用户生成一个团队对象数组,如下所示:

select u.*,
    (
        select json_arrayagg(json_object( 'id', t.id, 'title', t.title ) order by t.id )
        from teams t
        inner join team_user tu on tu.team_id = t.id
        where tu.user_id = u.id
    ) as json_teams
from users u

请注意,这仍然需要您列出teams表中的所有列,因为MySQL没有提供将记录转换为json对象的本地函数(与其他数据库(如Postgres)不同)。
我不明白表club是如何进入画面的,因为它似乎与其他表没有关系。

相关问题