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

MySQL能否通过子查询返回子查询表中的多条记录?

MySQL中获取关联多条记录的正确方式

你的原查询写法是行不通的——因为SELECT列表里的子查询必须是标量子查询(只能返回1行1列),而你的子查询返回了Table2的多条多列记录,MySQL会直接抛出1242: Subquery returns more than 1 row的错误。

不过完全不用做二次查询,这里有几种更合适的方案,根据你的业务需求选就行:

方案1:使用JOIN获取扁平化结果

这是最常用的方式,直接通过关联查询把Table1和Table2的记录对应起来:

SELECT table1.*, table2.*
FROM Table1 table1
LEFT JOIN Table2 table2 ON table2.key_id = table1.key_id
  • 结果特点:如果Table1的一条记录对应Table2的X条记录,结果里会生成X行,Table1的字段会重复出现。
  • 适用场景:需要逐条处理每条关联的Table2记录时,这种格式最方便后续业务逻辑处理。

方案2:聚合为JSON数组(推荐MySQL 5.7+)

如果希望每条Table1记录只出现一次,同时把对应的所有Table2记录打包成一个数组,可以用MySQL的JSON聚合函数:

SELECT 
  table1.*,
  JSON_ARRAYAGG(
    JSON_OBJECT(
      'key_id', table2.key_id,
      'col1', table2.col1,
      'col2', table2.col2 -- 列出你需要的Table2字段
    )
  ) AS table2_records
FROM Table1 table1
LEFT JOIN Table2 table2 ON table2.key_id = table1.key_id
GROUP BY table1.key_id, table1.col1, table1.col2 -- 必须包含Table1的所有非聚合字段
  • 结果特点:每条Table1记录对应一个table2_records字段,里面是JSON格式的数组,包含所有关联的Table2数据。
  • 适用场景:需要在业务端把一组Table2数据和对应的Table1记录绑定处理时,这种方式能避免结果集冗余。

方案3:字符串拼接(兼容老版本MySQL)

如果你用的是MySQL 5.7之前的版本,没有JSON函数,可以用GROUP_CONCAT把Table2的记录拼接成字符串:

SELECT 
  table1.*,
  GROUP_CONCAT(
    CONCAT('key_id:', table2.key_id, ', col1:', table2.col1)
    SEPARATOR '; ' -- 自定义分隔符,避免和字段内容冲突
  ) AS table2_records
FROM Table1 table1
LEFT JOIN Table2 table2 ON table2.key_id = table1.key_id
GROUP BY table1.key_id, table1.col1, table1.col2
  • 结果特点:把每条Table2记录转成字符串后拼接成一个字段,缺点是后续解析需要自己处理分隔符,适合字段内容简单的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:50:50