MySQL使用JOIN、GROUP_CONCAT和FIND_IN_SET关联查询问题求助
正确SQL写法及说明
核心查询语句
SELECT t1.id, t1.orderid, GROUP_CONCAT(t2.name SEPARATOR ', ') AS item_names FROM t1 LEFT JOIN t2 ON FIND_IN_SET(t2.id, t1.items) > 0 GROUP BY t1.id, t1.orderid;
关键说明
- 使用
LEFT JOIN保证所有订单(包括无匹配商品、items字段为空的订单)都能被查询出来 GROUP_CONCAT用于拼接匹配到的商品名称,SEPARATOR可根据需求调整分隔符(默认是逗号)GROUP BY必须包含t1中所有非聚合字段,避免因SQL模式(如ONLY_FULL_GROUP_BY)导致报错
性能优化建议(针对5.8万条订单数据)
- 优先重构表结构:将
t1中逗号分隔的items字段拆分为独立的关联表(如t_order_items,包含orderid和item_id),这是关系型数据库的规范设计,能彻底解决FIND_IN_SET带来的性能瓶颈 - 若无法修改表结构,可为
t2的id字段添加索引,提升匹配效率 - 若商品名称拼接后长度超出默认限制,可临时调整会话参数:
SET SESSION group_concat_max_len = 10240;(数值按需设置)
内容的提问来源于stack exchange,提问作者mohamed elghamry
相关产品推荐
相关产品推荐

