5

我有这样的 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

4

3 回答 3

2

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

你想要做的就是旋转。在 MySQL 中,这通常是通过一个地狱般的

....
aggregate_function(case when ...),
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

完全没问题,由应用程序开发人员来处理。对他们来说,这样做比你团队中的数据库人员要容易得多。

于 2013-10-08T10:35:03.093 回答
1

它可以在这种情况下工作,但它不是动态查询,并且只有在同一电子邮件最多存在 2 个链接时才能工作。

SELECT `name`, email, 
substring_index(group_concat(DISTINCT link SEPARATOR '/'),'/',1) as source_1,
if(group_concat(DISTINCT link SEPARATOR '/') like '%/%',
substring_index(group_concat(DISTINCT link SEPARATOR '/'),'/',-1),'') as source_2
FROM test2 group by email

如果您知道每封电子邮件中存在链接的确切数量,则可以相应地修改相同的查询。

于 2013-10-08T10:09:11.710 回答
1

不,你不能,因为使用 MySQL 你不能动态创建附加列......(这更像是一个 olap 的东西,或者允许这样的功能称为数据透视表)

于 2013-10-08T10:05:47.927 回答