Mysql 从SQL表在一个字段中插入和检索多个值

Mysql 从SQL表在一个字段中插入和检索多个值,mysql,sql,Mysql,Sql,我有一个名为“联系人列表”的SQL表,它有三列: 姓名|电话|电子邮件 一个人可以有多封电子邮件(每行一封) 假设一个人的名字是约翰,他有三封电子邮件,我必须把这三封电子邮件都拿出来 我想按一个人的名字列出所有属于他的电子邮件。我应该使用什么样的SQL查询?如果您想在一个eMail列中插入此人的所有电子邮件ID-用逗号分隔,请确保eMail字段的长度足够宽,可以容纳两个电子邮件ID,这样您就可以开始了 如果您可以将同一个人的不同电子邮件ID存储在不同的行中,但需要一个包含所有电子邮件ID的输出

我有一个名为“联系人列表”的SQL表,它有三列:

姓名|电话|电子邮件

一个人可以有多封电子邮件(每行一封)

假设一个人的名字是约翰,他有三封电子邮件,我必须把这三封电子邮件都拿出来


我想按一个人的名字列出所有属于他的电子邮件。我应该使用什么样的SQL查询?

如果您想在一个
eMail
列中插入此人的所有电子邮件ID-用逗号分隔,请确保
eMail
字段的长度足够宽,可以容纳两个电子邮件ID,这样您就可以开始了

如果您可以将同一个人的不同电子邮件ID存储在不同的行中,但需要一个包含所有电子邮件ID的输出 以a.k.a.的名字列出

|John | john@abc.com,john@xyz.com... 
您需要使用

假设您有一个数据集,其中John有两个不同的电子邮件ID:

要获得如下所示的结果集,请使用类似的查询(如代码段所示)


此处,john具有多个电子邮件ID。使用group_concat将所有表与一个表进行比较。

如果您想解决此问题而不出现任何难看的问题,您需要至少添加一个附加表。此表包含电子邮件地址和相应联系人列表条目的ID(或主键是什么)

目前,您的桌子大致如下所示

ContactList(Name, Phone, Email)
INSERT INTO ContactList (Name, Phone, Email) VALUES ('John Doe', '0000000', 'john@example.com')
SELECT Email FROM ContactList WHERE Name LIKE 'John Doe'
INSERT INTO Emails (PersonID, Email) VALUES (1, 'john@example.com')
您可以像这样插入值

ContactList(Name, Phone, Email)
INSERT INTO ContactList (Name, Phone, Email) VALUES ('John Doe', '0000000', 'john@example.com')
SELECT Email FROM ContactList WHERE Name LIKE 'John Doe'
INSERT INTO Emails (PersonID, Email) VALUES (1, 'john@example.com')
您检索具有以下特定名称的联系人的电子邮件地址

ContactList(Name, Phone, Email)
INSERT INTO ContactList (Name, Phone, Email) VALUES ('John Doe', '0000000', 'john@example.com')
SELECT Email FROM ContactList WHERE Name LIKE 'John Doe'
INSERT INTO Emails (PersonID, Email) VALUES (1, 'john@example.com')
为了存储每个联系人的多个地址,您需要做的是将此表分为两部分

ContactList(Name, Phone)
Emails(Name, Email)
注意:这是对数据库设计的最小调整。我不建议实际使用这个

这将是一个更好的设计:

Person(ID, Firstname, Surname)
Phonenumbers(PersonID, Phonenumber)
Emails(PersonID, Email)
您现在可以插入条目,而无需指定电话号码或电子邮件地址。此外,名称的两个部分(假设特定的命名模型适合您的区域设置)现在都可以独立寻址。现在每个人还可以有多个电话号码和电子邮件地址

现在,您必须自己插入联系人和电子邮件地址/电话号码

INSERT INTO Person (ID, Firstname, Surname) VALUES (1, 'John', 'Doe')
之后,您可以像这样添加电话号码和电子邮件地址

ContactList(Name, Phone, Email)
INSERT INTO ContactList (Name, Phone, Email) VALUES ('John Doe', '0000000', 'john@example.com')
SELECT Email FROM ContactList WHERE Name LIKE 'John Doe'
INSERT INTO Emails (PersonID, Email) VALUES (1, 'john@example.com')

如果有多个电子邮件地址或电话号码,只需根据需要重复最后两个示例

将数据输入应用程序的最简单方法是使用多个查询。示例方法如下所示:

首先,您必须获得数据库中所有个人的列表

SELECT ID, Firstname, Surname FROM Person
然后,对于每个人,您可以获得属于该人的所有电子邮件地址的列表(例如ID 1)

你可以用同样的方法得到一个人的电话号码。一旦您了解了所有这些是如何工作的,您就可以尝试更高级的功能,如JOIN、GROUP BY或AUTO_INCREMENT


但是,如果不允许更改数据库布局,也可以使用您选择的分隔符(例如逗号或分号)将所有电子邮件地址写入现有电子邮件列。假设您使用某种形式的编程语言来处理查询的结果数据,您只需使用字符串拆分来检索各个地址。

在这种情况下,个人和电子邮件之间的关系是1到n。因此,您可以构建另一个表,为具有指向Person的外键的人保存电子邮件。因此,我们有这样的结构:

表1:TblPerson=>字段:Id(自动递增整数)、姓名、电话

表2:TblEmails=>字段:Id(自动递增整数)、PersonId、电子邮件

PersonId是外键,其值来自TblPerson。 要检索数据时,可以在以下两个表之间建立联接:

Select P.Name , E.Email
from TblPerson P left join TblEmails E 
on (P.Id = E.PersonId)
但此结构显示重复的人员,即,如果一个人有3封电子邮件,此查询将为此人返回3条记录。 为避免此问题,您可以选择一个人的所有电子邮件作为逗号分隔字符串:

SELECT P.Name , GROUP_CONCAT(E.Email) as Emails
from TblPerson P left join TblEmails E
on (P.Id = E.PersonId)
GROUP BY Name ; 

此查询的结果将每个人的电子邮件显示为同一行中以逗号分隔的字符串。

谢谢您的回复。您能告诉我更多详细信息吗?当然。但是你能告诉我你需要哪个用例吗?您想插入数据还是想以上面给出的
John
示例的格式检索数据?@CoskunOlcucu我已经添加了片段。希望能回答您的问题:)我希望插入和检索给定示例中的数据。我正在使用C#进行此小型项目。我使用Microsoft Visual Studio创建联系人列表web表单。我可以插入具有姓名、电子邮件和电话号码的新联系人。唯一的问题是,如果此人有多个电子邮件地址,该怎么办。我明白了,因此,您可以控制数据库设计。我将扩展我的答案,解释如何通过调整数据库设计来解决这个问题。谢谢。我正在等待你的回答。我已经对一般方法添加了一个相当详细的解释。如果您想了解更多关于这背后的想法,我建议您阅读有关数据库规范化、主键/外键和数据库关系类型的内容。我将尝试您的建议。非常感谢您的解释。我的数据库中还有其他列,如地址和电话号码,所以每次我都要为不同的电子邮件存储相同的号码和地址。这并不奇怪,对吧?我使用Microsoft Visual Studio创建了此web表单。我的表单有“保存”、“删除”和“重置”按钮。当我按“保存”按钮时,我可以将新用户插入数据库表,因此,如何从这个角度插入新的电子邮件。我的意思是,当我添加john的其他电子邮件时,假设john的个人Id为“1”。如何将他的外键放入电子邮件表。这种1对n的关系通常以主-详细表的形式出现,即有一个主表(TblPerson)和详细表(TblEmails)。一种可能性是在包含mas的页面中有两个网格