首页 > 数据库技术 > 详细

Mysql内置函数GROUP_CONCAT()返回值的类型

时间:2021-08-01 13:01:42      阅读:46      评论:0      收藏:0      [点我收藏+]

一、简述

  记录在使用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位数据,结果也是空的。

Mysql内置函数GROUP_CONCAT()返回值的类型

原文:https://www.cnblogs.com/kongbailingluangan/p/15086143.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!