一、简述
记录在使用GROUP_CONCAT()函数的过程中所遇到的奇怪现象。
二、内容
建立stu_user与stu_log两张数据表,数据如下:
stu_user
stu_log(order为自增列,不完全是数字,有可能用日期时间来代替)
现在想查询张三、李四、王五最新一条的操作日志内容,利用GROUP_CONCAT()这个函数把最新一条的id先找出来。
SELECT GROUP_CONCAT(id ORDER BY `order` DESC) FROM stu_log GROUP BY p_id
得出:
再用IN查询SQL语句:
SELECT * FROM stu_log WHERE id IN( SELECT GROUP_CONCAT(id ORDER BY `order` DESC) FROM stu_log GROUP BY p_id)
这时奇怪的现象出来,查询结果是空的。
理论上在IN查询中,id:abcid008(王五的操作日志内容1)这条数据应该是能查询到的。
把SUBSTRING_INDEX()函数加上,SQL语句:
SELECT * FROM stu_log where id in ( SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY `order` DESC),‘,‘,1) FROM stu_log GROUP BY p_id)
得出:
数据正常,符合想象中的结果。这就说明GROUP_CONCAT()函数的返回值有些离奇。
证明一:
SELECT * FROM stu_log where id in ( SELECT CAST(GROUP_CONCAT(id ORDER BY `order` DESC) AS CHAR) FROM stu_log GROUP BY p_id)
数据正常。
证明二:
stu_log表的id去表英文字母abcid。
得出:
执行原来的sql语句:
SELECT * FROM stu_log WHERE id IN( SELECT GROUP_CONCAT(id ORDER BY `order` DESC) FROM stu_log GROUP BY p_id)
数据正常。
证明三:
stu_log表的id用英文字母代替(aaa/bbb/ccc/ddd/eee)。
数据正常。
但是,当id的英文字母增加到4位数据时,结果就为空了。
查询结果:
把id换成数字,但长度超过4位数据,结果也是空的。