【问题标题】:Two tables referring to each other两个表相互引用
【发布时间】:2017-05-08 13:05:12
【问题描述】:

我正在尝试创建一个简单的社交网络应用,其中包含有关用户及其朋友的记录。 即 ID 1 的用户有 ID 2、3 的朋友。ID 2 的用户有 ID 1、3、4 的朋友等。 现在我想获取有关该用户和他的朋友的记录。

我创建了两个表

用户

user_id | firstname | surname | age 

朋友

user_id | friend_id

并记录如下内容:

用户

user_id | firstname | surname | age 
1       | Nikola    | Misic   | 22
2       | Stefan    | Ilic    | 23
3       | Dragan    | Jovic   | null

朋友

user_id  | friend_id
    1    |    2
    1    |    3
    2    |    1
    3    |    1
    3    |    4 

user_id 和friend_id 都是外键,都指向用户表中的user_id。

关系如下所示:

我不确定这样的事情是否可行,我已经使用了 3 个表,其中两个表通过复合表连接。

【问题讨论】:

  • 是的,这完全有可能,而且是一件相对常见的事情。
  • 所以剩下的唯一事情就是构建查询。但我不完全确定如何。
  • “查询”。我敢肯定,您最终将需要在此表上进行大量查询。但无论如何,你还没有说你想要这个查询返回什么。朋友们?用户他们的朋友?还有什么?您是否尝试过编写这样的查询?如果您有一些基本的 SQL 知识,这将不难。
  • 即我会在我的 PHP 代码中有类似 $_GET['userid'] 的东西,然后我想获取他所有朋友的数据(user_id, firstname, surname, age) where (selected user) user_id = $_GET['用户身份']。我需要他朋友的数据。
  • 在我的脑海中,我想是select * from users u inner join friends f on u.user_id = f.friend_id where f.user_id = ? - ?将包含来自$_GET["userid"] 的用户标识参数

标签: mysql sql


【解决方案1】:

正如您所描述的那样,建议的关系(一个表有两个外键指向另一个表中的列)是完全可能的,而且是一件相对常见的事情。

在查询一个用户的朋友方面,根据你在cmets中的说法我认为是:

select 
  u.* 
from 
  users u 
  inner join friends f 
    on u.user_id = f.friend_id 
where 
  f.user_id = ?

? 将包含来自$_GET["userid"] 的用户标识参数

【讨论】:

  • 我现在感到很惭愧。我已经学会了如何连接表,但我从未见过只有两张表,其中一张是复合表。我一直在使用 3 张桌子。谢谢,我认为这应该可以,但我今天会测试它。
  • 你知道我怎样才能得到朋友的朋友,那些离所选用户只有两步之遥但与所选用户没有直接联系的人吗?
  • 是的,只需将“朋友”中的另一个“加入”添加到“朋友的朋友”中,再次使用 ID 通过“朋友”表链接他们。不过,在这个连接中,“朋友”将由朋友表中的“user_id”标识,“朋友的朋友”将是朋友表中的“朋友 ID”。试试吧,如果您不确定,请提出一个新问题,我可以提供详细的答案。
  • 我想我做到了select u.* from user u inner join friend f on u.user_id = f.friend_id inner join friend ff on f.user_id = ff.friend_id where ff.user_id = 4 AND u.user_id <> 4;
  • 我试过这个SELECT DISTINCT u.* FROM user u INNER JOIN friend f ON u.user_id = f.friend_id INNER JOIN friend ff ON f.user_id = ff.friend_id WHERE ff.user_id = 20 AND u.user_id <> 20; 并且它有效,但我也得到了直接连接到所选用户的用户。我只想得到朋友的朋友,他们不能直接连接到当前用户。在这里帮忙?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多