【问题标题】:trouble with join two table连接两个表的麻烦
【发布时间】:2014-10-13 18:24:40
【问题描述】:

我有两个表用户和联系人,其中注册用户使用 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”,它保存为“xyz”(没关系),user_id='1' 是 sachin

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

【问题讨论】:

  • contacts 表有什么用?它不能只连接用户(因为他们已经保存了phone_no)吗?所以结构是id, user_id1, user_id2
  • 你能提供想要的结果吗?你想做什么并不明显,因为表结构看起来很神秘。
  • 表中的人也是联系人用户吗?如果是的话,除了名字还有其他方法可以识别它们吗?我在这里缺少一个contact_id
  • What have you tried? 请展示您的尝试(不要指望我们编写一个免费且可立即使用的解决方案)。
  • 我已经简要提供了代码和实际需求。希望你能帮上忙。提前谢谢!!!

标签: php mysql


【解决方案1】:

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

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

用户

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 上创建一个唯一索引以增强您的查询。

【讨论】:

  • 我在我的问题中提到注册用户将使用 csv 上传他们的联系人。所以我已将他们的 user_id 与这些联系人联系起来。所以我不能像你的例子那样修改联系人。我很欣赏你的例子,但与我的结果不符。请检查我的代码,只有最后一次加入才能给我原始结果。
  • 好的,所以我的猜测似乎是正确的。在contacts表中user_id是relation_owner,而phone_no是在users表中找到relation_target的key。
  • 正是我面临同样的问题。我得到了有我号码的列表,但是当我运行查询时,它显示架构不明确。这就是问题。请帮帮我。
  • 我编辑的答案中的最后一个查询应该可以正常运行。您可以在示例中添加更多行吗?这也会有所帮助
  • 我更新了我的问题。请检查希望你能明白。我到底需要什么。并用我的代码回复类似的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多