3

我有三张桌子

USER TABLE
userid  username
1       alpha

Email TABLE
id  userid email
1   1      alpha1@test.com
2   1      alpha2@test.com
3   1      alpha3@test.com

Phonenumber TABLE
id  userid  phonenumber
1   1       123456
2   1       123457
3   1       123458

如何使用单个查询获得以下结果

userid username email           phonenumber
1      alpha    alpha1@test.com 123456
1      alpha    alpha2@test.com 123457
1      alpha    alpha3@test.com 123458
4

4 回答 4

2

让我们从一个完全没有标准化的数据版本开始,然后添加一些额外的、合理的数据,以便我们可以在这里看到标准化的工作原理。(假设每个人至少有一个电子邮件地址和一个电话号码,只是为了避免谈论空值。)

userid  username  email             phonenumber
1       Alpha     alpha1@test.com   123456
1       Alpha     alpha2@test.com   123457
1       Alpha     alpha3@test.com   123458
2       Beta      beta1@test.com    234567
2       Beta      beta2@test.com    234567      (2 email addresses, 1 phone)
3       Gamma     gamma1@test.com   234678
3       Gamma     gamma1@test.com   234679      (1 email address, 2 phones)
4       Alpha     alpha32@test.com  345678      (2 people, #1 and #4, with same name)

如果您仔细查看该数据,您会发现唯一的键是 {email, phonenumber}

这就是为什么您无法仅获得三行的原因——该键在您的表中无处可寻。这就是@ontrack 所说的“您的表格在电子邮件和电话号码之间没有唯一的关系”。

遵循任何数据库教科书中确定候选键的算法会给你同样的结果。AFAIK,本数据库理论教科书都至少有一种用于确定候选键的算法。

显然,如果您有一个以 {email, phonenumber} 为键的表,则用户 ID 1 只会得到 3 行。

于 2012-04-06T12:22:43.873 回答
1

我无法回答您的问题,但您考虑过使用group_concat()吗?

SELECT userid, username, GROUP_CONCAT(DISTINCT email), GROUP_CONCAT(DISTINCT phonenumber) 
FROM Email 
LEFT JOIN Phonenumber USING (userid) 
LEFT JOIN User USING (userid)
GROUP BY userid

它应该给你这个结果:

userid username  email                                           phonenumber
1      alpha     alpha1@test.com,alpha2@test.com,alpha3@test.com 123456,123457,123458

也许这会解决你原来的问题?

于 2012-04-06T10:48:30.233 回答
0

简单地。通过加入您的表格。

试试下面:

SELECT u.userid,u.username,e.email,p.phonenumber 
FROM User as u LEFT JOIN Email as e on u.userid=e.userid
LEFT JOIN Phonenumber as p on u.userid=p.userid
于 2012-04-06T09:24:52.027 回答
-1

SELECT userid, username, email, phonenumber FROM Email LEFT JOIN Phonenumber USING (userid) LEFT JOIN User USING (userid)

于 2012-04-06T09:30:42.117 回答