加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL GROUP_CONCAT和DISTINCT

发布时间:2020-12-11 23:46:13 所属栏目:MySql教程 来源:网络整理
导读:我有这样的tb1表: name email linkjohn myemail@gmail.com googlejohn myemail@gmail.com facebookjohn myemail2@gmail.com twitter........and more 当我用查询调用数据时 SELECT name,email,group_concat(DISTINCT link SEPARATOR '/') as sourceFROM tb1

我有这样的tb1表:

name   email               link
john   myemail@gmail.com   google
john   myemail@gmail.com   facebook
john   myemail2@gmail.com  twitter
....
....
and more

当我用查询调用数据时

SELECT name,email,group_concat(DISTINCT link SEPARATOR '/') as source
FROM tb1
group by email

结果像这样:

NAME    EMAIL               SOURCE
john    myemail2@gmail.com  twitter
john    myemail@gmail.com   facebook/google
....
....
and more

sqlfiddle

我想让结果看起来像:

NAME    EMAIL               SOURCE 1       SOURCE 2
john    myemail2@gmail.com  twitter
john    myemail@gmail.com   facebook       google

只有查询才能生成结果吗?

注意:我想制作动态列源1,2,3 ……,n

最佳答案 我的回答是,不要这样做!

你想要做的是称为旋转.在MySQL中,这通常是用一个地狱来完成的

....
aggregate_function(case when ...),aggregate_function(case when ...),...

块.但由于您不了解所有源代码,因此您必须编写一个过程来为您动态构建语句并执行它.即使这样,你最终也会得到一个类似的表结构

NAME    EMAIL               twitter     facebook    google
----------------------------------------------------------
john    myemail2@gmail.com  yes         no          no
john    myemail@gmail.com   no          yes         yes

那么,您的应用程序的程序员将如何知道列的命名方式?

为避免这种情况,您必须再次执行存储过程中的一个程序设计,以将每个电子邮件的行值放入一列.那么你将如何确定哪一行进入哪一列?如果facebook出现在列source1中的一行和列source2中的另一行中,该怎么办?在您的应用程序中,您必须测试或以其他方式确定实际有多少列,或者每个用户/电子邮件只能有2个来源?

总结一下,这样的结果

name   email               link
john   myemail@gmail.com   google
john   myemail@gmail.com   facebook
john   myemail2@gmail.com  twitter

完全没问题,应由程序开发人员来处理它.对于他们而言,这比为团队中的数据库人员更容易做到这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读