当遇到表关系是一对多的情况,例如一篇文章(article)有多个标签(label)时,当列表查询文章时,并要展示文章对应的标签。对应sql如下:
select t1.id, t1.title, GROUP_CONCAT(t2.`name`) from article t1 LEFT JOIN label t2 on t1.id = t2.article_id GROUP BY t1.id
当标签的数量不多时,没有什么问题,当文章的标签没有限制,出现很多时,会莫名其妙被截掉后面的标签。
因为mysql下的GROUP_CONCAT
函数默认的长度为1024/1KB,当拼接的长度超过1024时,会自动截取掉后面的数据。
如何查询group_concat的长度
mysql> show variables like "group_concat%"; +--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | group_concat_max_len | 1024 | +--------------------------+------------+
修改方法
- 修改配置文件
可以编辑my.cnf来修改(windows下my.ini),在[mysqld]段或者mysql的server配置段进行修改。可以编辑my.cnf来修改(windows下my.ini),在[mysqld]段或者mysql的server配置段进行修改。
代码如下:
group_concat_max_len = 102400
如果找不到my.cnf可以通过
代码如下:
mysql --help | grep my.cnf
linux下该文件在/etc/下。
- 直接通过sql语句修改
SET GLOBAL group_concat_max_len = 102400; SET SESSION group_concat_max_len = 102400;
注意:该方法缺点是重启服务后设置失效