You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL多表连接求助:4张表关联无法得到期望查询结果

解决表关联后的多值合并问题

我懂你的困扰——你想把一个预订对应的所有关联对象名称合并成完整的字符串,和预订详情、客户姓名一起展示,但目前只得到了不完整的结果。咱们一步步来搞定这个:

首先明确你的表关联逻辑:

  • bookings 和 customers 通过 customer_id 一对一关联
  • bookings 和 booking_objects 通过 booking_id 一对多关联
  • booking_objects 和 objects 通过 object_id 一对一关联

你的核心需求是把同一个预订下的多个 objects.name 合并成逗号分隔的字符串,再和其他字段组合起来。这里需要用到聚合函数合并多行结果,不同数据库的实现略有不同,我给你两种常见数据库的解决方案:

方案1:MySQL 版本

使用 GROUP_CONCAT 函数合并多值,同时通过 GROUP BY 确保按单个预订分组:

SELECT 
    CONCAT_WS(', ', b.booking_details, c.name, GROUP_CONCAT(o.name SEPARATOR ', ')) AS desired_result
FROM bookings b
INNER JOIN customers c ON b.customer_id = c.id
INNER JOIN booking_objects bo ON b.id = bo.booking_id
INNER JOIN objects o ON bo.object_id = o.id
WHERE b.id = 1 -- 指定要查询的预订ID
GROUP BY b.id, b.booking_details, c.name;

方案2:PostgreSQL 版本

PostgreSQL 用 STRING_AGG 替代 GROUP_CONCAT:

SELECT 
    CONCAT_WS(', ', b.booking_details, c.name, STRING_AGG(o.name, ', ')) AS desired_result
FROM bookings b
INNER JOIN customers c ON b.customer_id = c.id
INNER JOIN booking_objects bo ON b.id = bo.booking_id
INNER JOIN objects o ON bo.object_id = o.id
WHERE b.id = 1
GROUP BY b.id, b.booking_details, c.name;

为什么之前的结果不对?

你之前得到截断/不完整的结果,大概率是因为没用聚合函数合并多值,查询返回了两行数据(对应两个关联对象),而你的展示逻辑只取了第一行,或者没处理多行合并,导致看起来内容被截断了。

执行上面的查询后,就能直接得到你想要的结果:venue etc, John Citizen, Object 1, Object 2

内容的提问来源于stack exchange,提问作者Bablicious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:44:06