MySQL连接和连接行而不重复条目[重复]

Posted

技术标签:

【中文标题】MySQL连接和连接行而不重复条目[重复]【英文标题】:MySQL join and concat rows without repeating entries [duplicate] 【发布时间】:2017-01-01 23:44:16 【问题描述】:

我有一个关于如何将多行输出合并到一行而不多次使用相同条目的问题。 基本设置是 4 个表:

房间 约会 用户 行动

还有2个中间表:

actions_appointments users_appointments

我在帖子末尾发布了表格的确切结构。

可以为房间表中的一个条目进行多个约会 (n:1),但一个或多个用户可以加入约会 (n:n) 并且可以执行一个或多个操作 (n:n)。 问题是我不知道如何为每个用户输出一个约会,并且每个约会只显示一次操作。

通过这篇文章底部的示例表,我基本上希望这是我的输出:

|----------------|-----------|-------- -|-------------|-------------| |约会ID |房间名 |日期时间 |行动 |用户全名 | |----------------|-----------|-------- -|-------------|-------------| | 1 |工作室 | 2016-09-01 15:30:00 |工作,睡觉 |约翰·多伊,马丁·史密斯 | | 2 |办公室 | 2017-04-02 13:00:00 |睡觉 |约翰·多伊 | |----------------|-----------|-------- -|-------------|-------------|

但是我想出的队列是这样的:

|----------------|-----------|-------- -|-------------|-------------| |约会ID |房间名 |日期时间 |行动 |用户全名 | |----------------|-----------|-------- -|-------------|-------------| | 1 |工作室 | 2016-09-01 15:30:00 |工作、睡觉、|约翰·多伊,马丁·史密斯,| | | | |工作,睡觉 |约翰·多伊,马丁·史密斯 | | 2 |办公室 | 2017-04-02 13:00:00 |睡觉 |约翰·多伊 | |----------------|-----------|-------- -|-------------|-------------|

我的意思是我有点明白我搞砸了我的连接,但我现在完全被卡住了。有什么提示吗?我觉得解决方案很简单,但我现在完全失明了。

我的队列:

SELECT 
    appointments.id AS 'appointment_id', 
    room.name AS 'room_name', 
    appointments.datetime, 
    GROUP_CONCAT(actions.name SEPARATOR ', ') AS 'actions',
    GROUP_CONCAT(users.givenname, ' ', users.surname SEPARATOR ', ') AS 'userfullnames'

FROM appointments
INNER JOIN actions_appointments
        ON appointments.id = actions_appointments.appointments_id
INNER JOIN actions
        ON actions_appointments.actions_id = actions.id
INNER JOIN users_appointments
    ON users_appointments.appointments_id = appointments.id
INNER JOIN users
    ON users_appointments.users_id = users.id
INNER JOIN room
    ON appointments.room_id = room.id
GROUP BY
    appointments.id;

表结构:

基本表:

|-------------------| |房间 | |-------------------| |编号 |姓名 | |--------|----------| | 1 |办公室 | | 2 |工作室 | |-------------------| |----------------------------------------| |约会 | |--------|---------|----------| |编号 |房间号 |日期时间 | |--------|---------|----------| | 1 | 2 | 2016-09-01 15:30:00 | | 2 | 1 | 2017-04-02 13:00:00 | |--------|---------|----------| |------------------------------------------------------| |用户 | |------------------------------------------------------| |编号 |用户名 |名字 |姓氏 | |--------|----------|------------|---------| | 1 | j.doe |约翰 |能源部 | | 2 |史密斯|马丁 |史密斯 | |--------|----------|------------|---------| |--------------------| |行动 | |--------------------| |编号 |姓名 | |--------|------------| | 1 |工作 | | 2 |睡觉 | |--------------------|

中间表:

|------------------------------------------| |行动_约会 | |------------------------------------------| | action_id |约会ID | |------------|-----------------| | 1 | 1 | | 2 | 1 | | 2 | 2 | |------------|-----------------| |-----------------------------| |用户约会 | |-----------------------------| | users_id |约会ID | |----------|------| | 1 | 1 | | 2 | 1 | | 1 | 2 | |----------|------|

编辑:使用 DISTINCT 的正确队列 感谢 Juan.Queiroz 和 Mike!

SELECT 
    appointments.id AS 'appointment_id', 
    room.name AS 'room_name', 
    appointments.datetime, 
    GROUP_CONCAT(DISTINCT actions.name SEPARATOR ', ') AS 'actions',
    GROUP_CONCAT(DISTINCT users.givenname, ' ', users.surname SEPARATOR ', ') AS 'userfullnames'

FROM appointments
INNER JOIN actions_appointments
        ON appointments.id = actions_appointments.appointments_id
INNER JOIN actions
        ON actions_appointments.actions_id = actions.id
INNER JOIN users_appointments
    ON users_appointments.appointments_id = appointments.id
INNER JOIN users
    ON users_appointments.users_id = users.id
INNER JOIN room
    ON appointments.room_id = room.id
GROUP BY
    appointments.id;

【问题讨论】:

无效的 GROUP BY,不会在较新的 mysql 版本上运行。 (一般的 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或者是一个集合函数的参数。) GROUP_CONCAT(DISTINCT actions.name SEPARATOR ', ') @Mike 天哪,我知道了,我只是忘记了 DISTINCT。你完全正确,非常感谢,解决了它。这里太热了。 【参考方案1】:
GROUP BY
appointments.id, 
room.name, 
appointments.datetime

【讨论】:

以上是关于MySQL连接和连接行而不重复条目[重复]的主要内容,如果未能解决你的问题,请参考以下文章

删除重复行而不排序[重复]

显示所有textarea行而不滚动[重复]

Mysql连接表而不重复属于同一行的行

添加行而不覆盖(Python)[重复]

如何在 React Hooks 中向表中添加行而不重复?

使 SQL 查询返回重复行而不使用 UNION ALL 关闭