【问题标题】:Joining 3 MySQL Tables with data comparison通过数据比较加入 3 个 MySQL 表
【发布时间】:2013-03-07 15:58:53
【问题描述】:

我的数据库中目前有 3 个 MySQL 表,我正在尝试研究如何将它们连接在一起并比较它们之间的数据。

这些查询构成了“朋友或敌人”系统的一部分,我目前在业余时间作为一个副项目进行工作,但我无法终生解决它。我已经成功管理了一个 2 表连接,但是没有一个 3 表连接。

无论如何,这是表格布局。

表 1

Unique ID | Username | Password | Activity
1         | SomeUser | password | Active
2         | NewUsers | password | InActive
3         | GuestUse | password | Active

表 2

FileID    | UploadedBy | Type | FileName | Description
1         | SomeUser   | MP3  | Demo.mp3 | Bass Guitar Riff
2         | SomeUser   | MP4  | Demo.mp4 | Some Youtube Video

表 3

ListOwner | Friends  | Foes
SomeUser  | GuestUse | NULL
GuestUse  | SomeUser | NULL

我想要实现的只是“ListOwner”可以查看他/她的“朋友”列表中的用户上传的文件,自然会有一个页面可以查看所有上传的文件,但这是更旨在查看您更欣赏的人的上传。

本质上,我试图让查询读取; Table1 中的“用户名”、Table2 中的“UploadeBy”和 Table3 中的所有内容

示例: GuestUse 登录后,查询获取此信息并将他的用户名与表 3 进行比较,然后仅显示来自他的朋友列表中的人在表 2 中的上传。

对于结构,数据库具有以下设置。

  • 唯一 ID 和字段 ID 均为 INT(4)
  • 用户名是 VARCHAR(42)
  • 密码是 VARCHAR(30)
  • 活动是 VARCHAR(8)
  • ListOwner 是 VARCHAR(42)
  • 朋友和敌人都是文字

如果您能提供任何帮助,我们将不胜感激。

【问题讨论】:

    标签: mysql join inner-join


    【解决方案1】:

    表 2 字段“uploadedby”应该是数字用户 ID。

    FileID    | UploadedBy | Type | FileName | Description
    1         | 1          | MP3  | Demo.mp3 | Bass Guitar Riff
    2         | 1          | MP4  | Demo.mp4 | Some Youtube Video
    

    您应该为“朋友”关系和“敌人”关系创建一个表。

    Table 3: friends
    ListOwnerId | FriendId
    1           | 2
    1           | 3
    2           | 1
    
    Table 4: foes
    ListOwnerId | FoeId
    3           | 2
    

    然后进行从内到外的查询。

    SELECT friendid FROM friends WHERE listowner=$loginid;
    

    这将提取 $loginid 用户的所有朋友。

    如果 $someuseris 在 $loginid 好友列表中但 $someuserid 将 $loginid 设置为敌人,$loginid 是否应该查看 $someuserid 文件?想想那个。同时,foes表也没用了。

    现在,选择朋友的所有文件:

    SELECT * FROM files WHERE uploadedby IN (SELECT friendid FROM friends WHERE listowner=$loginid)
    

    此查询将为您提供所需文件的列表。

    这是通过子查询完成的,您也可以通过连接来完成。

    SELECT files.* FROM files JOIN friends ON files.uploadedby=friends.friendid WHERE friends.listowner=$loginid;
    

    【讨论】:

    • foes 表用于阻止其他用户与该用户“加为好友”,它被不同页面上的另一个查询拾取。我只是想减少桌子的数量。
    • 您不必关心餐桌数量。您必须首先关心正确的数据结构。
    • 编辑:这很完美,只需要更改我的数据库,以便它使用用户ID而不是用户名,完美!谢谢:)
    【解决方案2】:

    试一试:

    select t1.Username,
    t3.ListOwner,t3.Friends,t3.Foes,
    t2.UploadedBy,t2.Type,t2.FileName,t2.Description
    from Table1 t1
    inner join Table3 t3 on t1.Username = t3.ListOwner
    inner join Table2 t2 on t3.Friends = t2.UploadedBy
    where Username = 'GuestUse';
    

    【讨论】:

      猜你喜欢
      • 2021-05-16
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      相关资源
      最近更新 更多