【问题标题】:Link together a friend and user table (to get usernames of friends?)将朋友和用户表链接在一起(获取朋友的用户名?)
【发布时间】:2017-06-29 23:50:43
【问题描述】:

我的user表并没有什么异常,使用primary 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)..)

看起来一点也不对。

我该怎么做?

【问题讨论】:

  • 外键也是有用的东西,但在您的情况下不是必需的。它们提供了相对的数据库一致性

标签: php mysql database schema


【解决方案1】:

如果您也发布了用户表会更容易。 假设您有一个包含以下字段的用户表:id、用户名、电子邮件...无论如何,您可以执行以下简单连接:

SELECT * FROM friends
INNER JOIN users
ON users.id = friends.fid
WHERE friends.uid = 1;

这当然是选择符合 WHERE 条件的好友记录,并根据 ON 子句中定义的关系从这些记录中找到 users 表中的相应行。 (从技术上讲,在 db 引擎中它的工作方式略有不同)在结果集中,一行将包括来自朋友和用户表的所有列,但您可以通过定义 SELECT 来修改结果中的列,例如:

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

您不需要在朋友表中显式定义外键来执行这样的简单连接。但是这样做可以帮助您跟踪表之间的关系,此外,您可以使 MySQL 在删除或更新行时自动保持数据库的一致性。 http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html.

【讨论】:

  • 感谢您提供的示例,与我所做的相比,它看起来非常好,我终于有理由学习 JOIN 语法了!感谢您提及as 部分,在测试时会为我节省一些头发。
【解决方案2】:

您应该使用 JOIN。您应该将朋友表与用户表一起加入:

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

【讨论】:

  • 这基本上会返回所有朋友 ID 并从用户表中匹配它们并打印您喜欢的任何列。您可以执行“select * ...”来查看所有返回的列。
【解决方案3】:
SELECT 
      u.username, 
      f.fid 
FROM 
      friends f, 
      users u 
WHERE 
      f.uid = 12 and 
      u.uid = f.fid

【讨论】:

    【解决方案4】:

    首先,不要认为主键在你提供的create table中是有效的

    PRIMARY KEY (`user_id`, `friend_id`) 
    

    这些列在您的表中不存在。

    第二:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多