连接两个表的麻烦

时间:2014-08-20 11:51:09

标签: php mysql

我有两个表用户和联系人,其中注册用户使用csv添加记录以及他们在联系人表中的ID。

我的表格结构

user

id   name     phone_no  verify
1    sachin   123        yes
2     max     345        yes
3    john     99         yes

contacts

contacts_id   name    phone_no   user_id
     1        xyz     345        1
     2        abc     123        2
     3        john    99         1

结果

1) search phone_no '123' from contacts table

contacts_id   name    phone_no   user_id
     2         abc     123        2

2) i got my number '123' in 2nd row will check who has my number so got user_id='2'

3) now i have checked whether 'max' (id='2') has phone_no ('123') in contacts table

4) So max phone_no is '345'

contacts_id   name    phone_no   user_id
      1        xyz     345        1

5)我得到最大数字'345',用user_id ='1'保存为'xyz'(无关紧要),这是sachin

6)所以我只想让那些拥有我的号码并且拥有我的用户。(最终结果)

1 个答案:

答案 0 :(得分:0)

我相信你需要重新设计你的架构,因为(据我所知)你有一个主用户表,你有一个功能允许用户添加其他用户作为他的联系人,所以你需要保持跟踪哪些用户是其他用户的联系人。

表联系人不需要包含姓名或号码。该数据必须始终来自users表以确保一致性。

用户

id   name     phone_no  verify
1    sachin   15123        yes
2    max      26345        yes
3    john     37345        yes
4    peter    48345        yes
5    sam      59345        yes

联系人

relation_id  relation_owner   relation_target
1            1                2 
2            1                3
3            2                3
4            2                4
5            2                5
6            3                1  

这样,您要回答的问题将通过以下查询解决

select u1.name as me, 
       u2.name as contact
from   users u1 
join contacts c1 on u1.id=c1.relation_owner
join contacts c2 on c2.relation_owner=c1.relation_target and   c2.relation_target=c1.relation_owner
join users u2 on c2.relation_owner=u2.id
where u1.id=:userid

现在,如果我尝试对你的架构做同样的事情。

用户

id   name     phone_no  verify
1    sachin   123        yes
2     max     345        yes

联系人

id   name    phone_no   user_id
1    xyz     345        1
2    abc     123        2

修改澄清之后

获取用户1(sachin)的联系人

select u1.name as me, 
       u2.name as contact 
from user u1 
join contacts c1 on u1.phone_no = c1.phone_no
join user u2 on c1.user_id=u2.id
where user.id=1

获取用户sachin的联系人,反过来,他们在他们的联系人中有sachin

select u1.name as me, 
       u2.name as contact 
from user u1 
join contacts c1 on u1.phone_no = c1.phone_no
join user u2 on c1.user_id=u2.id
join contacts c2 on u2.phone_no = c2.phone_no and c2.user_id=u1.id
where u1.id=1

我建议在contacts.phone_no上创建索引,并在users.phone_no上创建唯一索引以增强查询。