【问题标题】:Joining multiple SQL queries to display online friends list?加入多个 SQL 查询以显示在线好友列表?
【发布时间】:2013-05-13 02:15:10
【问题描述】:

我正在尝试将 3 个表连接在一起以显示从表 subscribers 中获取的表 users 的列表,其中它们的 IP = 表 online 中的 IP。

subscribers 表:(不允许重复,type 告诉其他用户是否已订阅。)

sender  recipient
1       5     
5       3 

users表:

id  loginip
1   192.168.0.1
3   192.168.0.2
5   192.168.0.3

online表:

ip
192.168.0.1
192.168.0.2
192.168.0.5

所以查询应该抓取id的,找到idloginip然后扫描online表并返回在线用户:(假设UserID = 5)

sender  recipient  send_ip       reci_ip
5       3          192.168.0.3   192.168.0.2
1       5          192.168.0.1   192.168.0.3

如果user = 5,我还需要想办法切断IP,这样它就不会在列表中显示你自己。在你们中的一个好人帮助我之后,我可能会自己做到这一点。 :)

我的尝试,虽然很差:

SELECT  f.sender as friend1,
    f.recipient as friend2,
    u1.loginip ip1,
    u2.loginip ip2
FROM subscribers f
INNER JOIN users u1 ON u1.id = f.sender
INNER JOIN users u2 ON u2.id = f.recipient
INNER JOIN online o1 ON o1.ip = u1.loginip
INNER JOIN online o2 ON o2.ip = u2.loginip
WHERE 
    f.sender = 5 OR 
    f.recipient = 5;

谢谢。

更新:我一定很累,因为它突然起作用了?真的很抱歉。

【问题讨论】:

  • 你打算对使用多个ip的人或多人使用的单个ip做什么
  • 他们的 IP 在他们登录时更新,在线行在 15 分钟不活动后删除。稍后我将添加一个标识符来解决这些问题。
  • 您的查询缺少什么?有什么问题吗?
  • 假设 userID=1 登录,然后由于多个 INNER JOIN 将其 IP 拖入所有行,即使对方不在线也是如此。我在加入查询方面没有太多经验,所以我被卡住了。
  • 您正在使用INNER JOINS(这是理所当然的)。他们将过滤掉两者中的任何一个都不在线的记录。

标签: php sql mysqli


【解决方案1】:

正确答案包含在问题中。我发布它只是为了让问题看起来没有没有答案。

SELECT  f.sender as friend1,
    f.recipient as friend2,
    u1.loginip ip1,
    u2.loginip ip2
FROM subscribers f
INNER JOIN users u1 ON u1.id = f.sender
INNER JOIN users u2 ON u2.id = f.recipient
INNER JOIN online o1 ON o1.ip = u1.loginip
INNER JOIN online o2 ON o2.ip = u2.loginip
WHERE 
    f.sender = 5 OR 
    f.recipient = 5;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多