MySQL连接表拼接

3
我有一个需求,需要在联接中返回与会话相关的所有教育工作者的连接列表(不要问我为什么 - 我知道有多种方法可以做到,但我正在使用一个不接受这些方法的库 ;-))。
我有一个包含session_idsession_namesessions表。
| session_id | session_name |
+------------+--------------+
| 1          | Swimming     |
| 2          | Chess        |

我有一个 session_educators 表格,它基本上是一个连接表格,包含了session_idcontact_id

| session_id | contact_id |
+------------+------------+
| 1          | 1          |
| 1          | 2          |
| 2          | 3          |
| 2          | 4          |

我有一个名为contacts的表,其中包含contact_idfull_name两个字段。

| contact_id | full_name    |
+------------+--------------+
| 1          | Fred Bloggs  |
| 2          | Mary Bloggs  |
| 3          | Mark Smith   |
| 4          | Shelly Smith |

到目前为止,这似乎是我所能达到的最接近的:
SELECT
    sessions.session_id,
    sessions.name,
    educators.names
FROM
    `sessions`
LEFT JOIN
    (
        SELECT
            GROUP_CONCAT(contacts.full_name SEPARATOR ', ') as names
        FROM
            `contacts`
        WHERE
            contact_id 
        IN 
            (
                SELECT
                    contact_id
                FROM
                    session_educator
                WHERE
                    session_educator.session_id = sessions.session_id
            )
    ) `educators`
USING
    (`session_id`)

但是我真的在摸索着弄清楚它,有人能帮忙吗?

从查询中可以看出,我想要的结果就像这样:

| session_id | session_name | educators                |
+------------+--------------+--------------------------+
| 1          | Swimming     | Fred Bloggs, Mary Bloggs |
| 2          | Chess        | Mark Smith, Shelly Smith |

任何帮助都受到高度赞赏 - 即使只是说它不能被完成!
2个回答

2

您不需要使用子查询。只需进行几次联接和聚合操作即可:

select s.session_id, s.session_name,
       group_concat(e.name separator ', ') as educators
from sessions s left join
     session_educators se
     on se.session_id = s.session_id left join
     educators e
     on e.educator_id = se.educator_id
group by s.session_id;

1
我相信你把事情搞得比需要的更加复杂了(除非我在你的要求中漏掉了什么?我知道库有时候会很麻烦...) 这对我有效:
SELECT
    session_id,
    session_name,
    (
        SELECT
            GROUP_CONCAT(full_name SEPARATOR ', ') as names
        FROM
            contacts c,
            session_educators se
        WHERE
            c.contact_id = se.contact_id
        AND
            se.session_id = s.session_id
    )
FROM
    sessions s
;

谢谢,也非常有效。我真的很喜欢stackoverflow :-) - annoyingmouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接