连接两个没有任何主键的表都有外键

时间:2014-05-21 14:05:44

标签: mysql sql join

我有三张桌子:

列表(盖,LIST_NAME)
电话(PID,盖,PHNO)
电子邮件(EID,盖,电子邮件)

具有此处所示记录的表

列表

lid ----------- list_name

**1** ------------- **ads**

**2** ------------- **visits**

电话

pid ------- lid ----------- phno

10 ---------**1** ---------- 9988123456

20 ---------**1** ---------- 9988123454

30 ---------**2** ---------- 9988222222

40 ---------**2** ---------- 9988333333

电子邮件

eid ------- lid ----------- email

1 ---------**1** ---------- xyz@abc.com

2 ---------**1** ---------- abc@abc.com

3 ---------**2** ---------- list2@abc.com

4 ---------**2** ---------- list21@abc.com

我想用外键盖创建表格电子邮件和手机之间的连接。

我试过这样的

SELECT * FROM phone left join emails on phone.lid = emails.lid WHERE 1 

并从此查询获得输出

pid -- lid ---- phno ---------- eid --- lid --- email

10 ----- 1 --- 9988123456 -- **1** --- 1  --- xyz@abc.com

20 ----- 1 --- 9988123454 ---**1** --- 1  --- xyz@abc.com

10 ----- 1 --- 9988123456 ---**2** --- 1  --- abc@abc.com

20 ----- 1 --- 9988123454 ---**2** --- 1  --- abc@abc.com

30 ----- 2 --- 9988222222 -- **3** --- 2  --- list2@abc.com

40 ----- 2 --- 9988333333 ---**3** --- 2  --- list2@abc.com

30 ----- 2 --- 9988222222 ---**4** --- 2  --- list21@abc.com

40 ----- 2 --- 9988333333 ---**4** --- 2  --- list21@abc.com

在这里你可以看到我们收到重复的电子邮件和重复的电话号码,但我希望结果是任何行都不应该有任何重复的电子邮件和重复的电话,它们都必须是唯一的,如下所示:

pid -- lid ---- phno ---------- eid --- lid --- email

20 ----- 1 --- 9988123454 ---**1** --- 1  --- xyz@abc.com

10 ----- 1 --- 9988123456 ---**2** --- 1  --- abc@abc.com

30 ----- 2 --- 9988222222 -- **3** --- 2  --- list2@abc.com

40 ----- 2 --- 9988333333 ---**4** --- 2  --- list21@abc.com

我被困在这里。请建议我解决方案。

1 个答案:

答案 0 :(得分:0)

您的表格结构不允许您获得预期的输出。 在表Phone中(根据给定的数据) lid 不能是候选键。表Emails中的 lid 也是如此。

lid 不能用作外键。 外键必须引用父表的主键或唯一键(候选键)。但在任何一个表中都不是这种情况。

我建议引入一个新列来获得您需要的一对一映射