Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mysql中拆分/取消分组?_Mysql_Sql_Database_Phpmyadmin_Group Concat - Fatal编程技术网

如何在mysql中拆分/取消分组?

如何在mysql中拆分/取消分组?,mysql,sql,database,phpmyadmin,group-concat,Mysql,Sql,Database,Phpmyadmin,Group Concat,我目前有一个视图,其中有一个列名为alt_email_contact,我使用group_concat函数来获取与一个联系人关联的多封电子邮件。不过,我希望能够提取每封电子邮件,并为每封邮件创建一个单独的列 例如: id email 1 SkyW@gmail.com, SW@gmail.com, WW@gmail.com, WalterW@gmail.com 电子邮件的数量会随着用户的不同而变化,因此每个用户不会总是有四封电子邮件。我想为每封电子邮件创建一个新列,如下所示: i

我目前有一个视图,其中有一个列名为alt_email_contact,我使用group_concat函数来获取与一个联系人关联的多封电子邮件。不过,我希望能够提取每封电子邮件,并为每封邮件创建一个单独的列

例如:

id    email
 1     SkyW@gmail.com, SW@gmail.com, WW@gmail.com, WalterW@gmail.com 
电子邮件的数量会随着用户的不同而变化,因此每个用户不会总是有四封电子邮件。我想为每封电子邮件创建一个新列,如下所示:

id      email_1         email_2        email_3        email_4 
1       SkyW@gmail.com  SW@gmail.com   WW@gmail.com   WalterW@gmail.com 

(我正在使用phpmyadmin)我希望能够修改我的视图,以包含每个用户的可变电子邮件数量

您可以使用
substring\u index()
实现您想要的功能。它不是很漂亮,但会起作用:

select id,
       substring_index(emails, ', ', 1) as email_1
       (case when length(emails) - length(replace(emails, ',', '')) >= 1
             then substring_index(substring_index(emails, ', ', 2), ', ', -1)
        end) as email_2,
       (case when length(emails) - length(replace(emails, ',', '')) >= 2
             then substring_index(substring_index(emails, ', ', 3), ', ', -1)
        end) as email_3,
       (case when length(emails) - length(replace(emails, ',', '')) >= 3
             then substring_index(substring_index(emails, ', ', 4), ', ', -1)
        end) as email_4,
       (case when length(emails) - length(replace(emails, ',', '')) >= 4
             then substring_index(substring_index(emails, ', ', 5), ', ', -1)
        end) as email_5     
from table t;

如果愿意,您可以将这些值插入另一个表。

不要使用该视图,因为
GROUP\u CONCAT()
已经破坏了规范化。您希望使用MySQL有限的SQL功能模拟数据透视表

让我们假设您的视图基于如下所示的
Contacts
表:

CREATE TABLE Contacts
( id INTEGER NOT NULL
, alt_email_contact VARCHAR(256) NOT NULL
);
改为创建这个helper视图(基本上是
RANK()(通过alt\u email\u contact按id顺序分区)
,除了MySQL不支持
RANK()
):

然后,您可以编写此查询或视图,其中最多提供5个备选电子邮件地址,按字母顺序排列:

CREATE VIEW ContactsForImport AS
    SELECT c1.id
         , c1.alt_email_contact AS email_1
         , c2.alt_email_contact AS email_2
         , c3.alt_email_contact AS email_3
         , c4.alt_email_contact AS email_4
         , c5.alt_email_contact AS email_5
        FROM NumberedContacts AS c1
            LEFT OUTER JOIN NumberedContacts AS c2
                ON c1.id = c2.id AND c2.rank = 2
            LEFT OUTER JOIN NumberedContacts AS c3
                ON c1.id = c3.id AND c3.rank = 3
            LEFT OUTER JOIN NumberedContacts AS c4
                ON c1.id = c4.id AND c4.rank = 4
            LEFT OUTER JOIN NumberedContacts AS c5
                ON c1.id = c5.id AND c5.rank = 5
        WHERE c1.rank = 1;

你为什么要这么做?将每封备选电子邮件放在自己的行中(即根本没有
group\u concat
)有什么错?这比拥有
X
列数(在进行初始查询之前,
X
不为人所知)更具可扩展性。SQL查询具有固定的列数。你想要多少封电子邮件?@MikeBrant我正在将这些字段导入另一个数据库,为此,我必须将一个字段映射到另一个字段。因此,我需要所有与一个联系人相关联的电子邮件都在一行中(并且每封电子邮件都在一个单独的列中)。@GordonLinoff我想要5封电子邮件,但可以少于5@dantheman在目标数据库中,为什么需要将这些值都放在一行中?实际上,您试图做的并不是关系数据库的本意。谢谢!这看起来正是我所需要的,但是有没有任何方法可以让我以与选择视图相同的方式创建视图?我需要视图实际具有与select相同的结构。不确定问题是什么。您可以使用
CREATE view ViewName AS SELECT…
从任何
SELECT
创建视图。啊,好吧!我不确定,因为这里有单独的声明。可能是沟通错误。
NumberedContacts
视图只是一个中间视图,用于构建您真正想要的视图。@GordonLiff,当我尝试实现此查询时,它会给我提供重复项,因此,例如,如果一个联系人只有两封电子邮件,它将显示以下内容:email\u 1:w@gmail.com,电邮:ww@gmail.com,电邮:ww@gmail.com,电邮(四):ww@gmail.com,电邮:ww@gmail.com. 如何解决此问题?对于输出的每一列,您需要更深入地嵌套
子字符串\u index()
调用。我始终需要5列。@dantheman。比较时,中出现了一个off by错误。
CREATE VIEW ContactsForImport AS
    SELECT c1.id
         , c1.alt_email_contact AS email_1
         , c2.alt_email_contact AS email_2
         , c3.alt_email_contact AS email_3
         , c4.alt_email_contact AS email_4
         , c5.alt_email_contact AS email_5
        FROM NumberedContacts AS c1
            LEFT OUTER JOIN NumberedContacts AS c2
                ON c1.id = c2.id AND c2.rank = 2
            LEFT OUTER JOIN NumberedContacts AS c3
                ON c1.id = c3.id AND c3.rank = 3
            LEFT OUTER JOIN NumberedContacts AS c4
                ON c1.id = c4.id AND c4.rank = 4
            LEFT OUTER JOIN NumberedContacts AS c5
                ON c1.id = c5.id AND c5.rank = 5
        WHERE c1.rank = 1;