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
相关产品推荐
相关产品推荐

