博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
两个表联合查询去重复GROUP_CONCAT
阅读量:5035 次
发布时间:2019-06-12

本文共 2666 字,大约阅读时间需要 8 分钟。

有两个表进行联合查询,以其中一个表的字段 LEFT JOIN 或者 INNER JOIN 联合查询。例如 SELECT *  as name FROM  source mm LEFT JOIN ke  ss ON mm.id=ss.tid 来查询,如果两个表有重复数据,这个时候,我们借助,一个mysql函数来 实现

首先我们要注意一点

就是 group_concat(distinct ss.cname SEPARATOR ',') 是数据以“,”链接起来 其中“,”可以用其他符号代替group_concat(distinct ss.cname SEPARATOR ',') as name   放入name这个字段

我们就可以直接调用name 的值了,一般group_concat 是和 group by name一起使用的。

GROUP_CONCAT()是MySQL数据库提供的一个函数,通常跟GROUP BY一起用,具体可参考MySQL官方文挡:。

语法:

GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {
unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val]) 1.例如: SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id; ------------ --------- | student_id | courses | ------------ --------- | 2 | 3,4,5 | ------------ --------- 这 就不需要用php循环了 $row = $pdo->query("SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id"); $result = explode(',', $row['courses']);

2.当然分隔符还可以自定义,默认是以“,”作为分隔符,若要改为“|||”,则使用SEPARATOR来指定,例如:

SELECT student_id, GROUP_CONCAT(courses_id SEPARATOR '|||') AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id; ------------ --------- | student_id | courses | ------------ --------- |            2        | 3|||4|||5    | ------------ --------- 3.除此之外,还可以对这个组的值来进行排序再连接成字符串,例如按courses_id降序来排: SELECT student_id, GROUP_CONCAT(courses_id ORDER BY courses_id DESC) AS courses FROM student_courses WHERE student_id=2 GROUP BY student_id; ------------ --------- | student_id | courses | ------------ --------- |            2        | 5,4,3   | ------------ --------- 4.需要注意的:

a.int字段的连接陷阱

当你用group_concat的时候请注意,连接起来的字段如果是int型,一定要转换成char再拼起来,
否则在你执行后(ExecuteScalar或者其它任何执行SQL返回结果的方法)返回的将不是一个逗号隔开的串,
而是byte[]。
该问题当你在SQLyog等一些工具中是体现不出来的,所以很难发现。
select group_concat(ipaddress) from t_ip 返回逗号隔开的串
select group_concat(id) from t_ip 返回byte[]
select group_concat(CAST(id as char)) from t_dep 返回逗号隔开的串
select group_concat(Convert(id , char)) from t_dep 返回逗号隔开的串
附Cast,convert的用法:
CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name)
CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值。
这个类型 可以是以下值其中的 一个:
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
b.长度陷阱
用了group_concat后,select里如果使用了limit是不起作用的.
用group_concat连接字段的时候是有长度限制的,并不是有多少连多少。但你可以设置一下。
使用group_concat_max_len系统变量,你可以设置允许的最大长度。
程序中进行这项操作的语法如下,其中 val 是一个无符号整数:
SET [SESSION | GLOBAL] group_concat_max_len = val;
若已经设置了最大长度, 则结果被截至这个最大长度。
在SQLyog中执行 SET GLOBAL group_concat_max_len = 10 后,重新打开SQLyog,设置就会生效。

转载于:https://www.cnblogs.com/kakaxi/archive/2011/01/21/1940890.html

你可能感兴趣的文章
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>
函数中关于const关键字使用的注意事项
查看>>
js随机数的取整
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
golang 的编译安装以及supervisord部署
查看>>
Eclipse导入maven项目时,Pom.xml文件报错处理方法
查看>>
01、JAVA开发准备
查看>>
抽象工厂模式(Abstract Factory)
查看>>
luogu1373 小a和uim之大逃离 (dp)
查看>>
Redis的Pub/Sub客户端实现
查看>>
springMVC入门(一)------springMVC基本概念与安装
查看>>
Sam做题记录
查看>>
[bzoj] 2453 维护数列 || 单点修改分块
查看>>
IIS版本变迁
查看>>
mybatis09--自连接一对多查询
查看>>
myeclipse10添加jQuery自动提示的方法
查看>>
【eclipse jar包】在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。...
查看>>
软件工程APP进度更新
查看>>
Python 使用正则替换 re.sub
查看>>