Php 将朋友和用户表链接在一起(获取朋友的用户名?)

Php 将朋友和用户表链接在一起(获取朋友的用户名?),php,mysql,database,schema,Php,Mysql,Database,Schema,“我的用户”表并非与众不同,它使用主id字段作为用户id 然而,我的朋友表如下所示: CREATE TABLE `friends` ( `uid` INT NOT NULL , `fid` INT NOT NULL , PRIMARY KEY (`user_id`, `friend_id`) ) ENGINE = MYISAM ; 我可以很容易地找到一个用户的朋友,即 SELECT fid FR

“我的用户”表并非与众不同,它使用主id字段作为用户id

然而,我的朋友表如下所示:

CREATE TABLE `friends` (
  `uid` INT NOT NULL ,                       
  `fid` INT NOT NULL ,                  
  PRIMARY KEY (`user_id`, `friend_id`)   
) ENGINE = MYISAM ;
我可以很容易地找到一个用户的朋友,即

SELECT fid FROM friends WHERE uid = 12
这将基本上返回一个id形式的朋友列表,但是我不确定如何获取他们的用户名或其他数据的方法。我听说过外键(当然也听说过加入),但不知道如何选择我需要做的事情

现在我用这种丑陋的方法:

SELECT username FROM users WHERE id IN (1,2,3,4..(other fid's)..)
这似乎根本不对


我应该怎么做?

你应该使用JOIN。您应该将朋友表与用户表联接:

select
  f.fid,
  u.name as friend_name
from
  friends f
join
  users u on u.id = f.fid and f.uid = 16

首先,不要认为您提供的create表中的主键有效

PRIMARY KEY (`user_id`, `friend_id`) 
表中不存在这些列

第二:

SELECT users.username FROM friends,users WHERE users.id=friends.fid

如果你也发布了你的用户表,那就容易多了。 假设您有一个由以下字段组成的用户表:id、用户名、电子邮件。。。不管怎样,您都可以执行以下简单连接:

SELECT * FROM friends
INNER JOIN users
ON users.id = friends.fid
WHERE friends.uid = 1;
这样做当然是选择满足WHERE条件的friends记录,并根据ON子句中定义的关系从这些记录中找到users表中的相应行。(从技术上讲,在db引擎中,它的工作原理略有不同)在结果集中,一行将包括friends和users表中的所有列,但您可以通过定义SELECT like来修改结果中的列:

SELECT friends.uid as uid, friends.fid as fid , users.username as username 

您不需要在friends表中显式定义外键来执行这样的简单联接。但这样做有助于跟踪表之间的关系,而且可以使MySQL在删除或更新行时自动保持数据库的一致性

这基本上会返回所有的好友ID,并从users表中匹配它们,然后打印您喜欢的任何列。您可以执行“选择*…”以查看返回的所有列。外键也很有用,但在您的情况下不是必需的。他们提供了相对的数据库一致性谢谢你这个例子,与我正在做的相比,它看起来非常好,我有理由最终学习连接语法!感谢您将
提到
部分,这将在测试时为我节省一些时间。
SELECT friends.uid as uid, friends.fid as fid , users.username as username