我有一个名为"联系人列表"的SQL表。它有三列:
姓名|电话|电子邮件
一个人可以拥有多个电子邮件(每行一个)。
让我们说人名是约翰,并且有三封电子邮件,我必须提取所有三封电子邮件。
我想以他的名字列出属于一个人的所有电子邮件。我应该使用什么SQL查询?
答案 0 :(得分:0)
如果要在一个eMail
列中插入该人员的所有电子邮件ID(用逗号分隔),请确保eMail
字段的长度足够宽,以容纳几个电子邮件身份证,你很高兴。
如果您可以将同一个人的不同电子邮件ID存储在不同的行中,但希望输出包含所有电子邮件ID 以a.k.a.名字列出
|John | john@abc.com,john@xyz.com...
您需要使用 https://developers.google.com/apps-script/guides/jdbc
我们假设您拥有此数据集,其中John存在两个不同的电子邮件ID:Group Concat
此处, john 存在多个电子邮件ID。使用 group_concat 会将所有这些内容列为一个。
答案 1 :(得分:0)
如果你想在没有任何丑陋黑客的情况下解决这个问题,你需要添加至少一个额外的表。此表包含电子邮件地址和相应联系人列表条目的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'
为了在每个联系人中存储多个地址,您需要做的是将此表分成两部分。
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')
之后,您可以添加这样的电话号码和电子邮件地址
INSERT INTO Emails (PersonID, Email) VALUES (1, 'john@example.com')
和
INSERT INTO Phonenumbers (PersonID, Phonenumber) VALUES (1, '00000000')
如果有多个电子邮件地址或电话号码,只需根据需要重复最后两个例子。
将数据导入应用程序的最简单方法是使用多个查询。示例方法如下所示:
首先,您必须获取数据库中所有个人的列表
SELECT ID, Firstname, Surname FROM Person
然后,对于每个人,您可以获取属于该人的所有电子邮件地址的列表(ID 1的示例)
SELECT EMail FROM Emails WHERE PersonID=1
您可以使用相同的方法获取某人的电话号码。一旦了解了所有这些的工作原理,就可以尝试更高级的功能,如JOIN,GROUP BY或AUTO_INCREMENT。
但是,如果无法更改数据库布局,则还可以使用您选择的分隔符(例如逗号或分号)将所有电子邮件地址写入现有电子邮件列。假设您使用某种形式的编程语言来处理查询的结果数据,您只需使用字符串拆分来检索单个地址。
答案 2 :(得分:0)
在这种情况下,人与电子邮件之间的关系是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条记录。 要避免此问题,您可以选择一个Person的所有电子邮件作为逗号分隔的字符串:
SELECT P.Name , GROUP_CONCAT(E.Email) as Emails
from TblPerson P left join TblEmails E
on (P.Id = E.PersonId)
GROUP BY Name ;
此查询的结果会将每个人的电子邮件显示为同一行中逗号分隔的字符串。