【发布时间】: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的,找到id的loginip然后扫描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(这是理所当然的)。他们将过滤掉两者中的任何一个都不在线的记录。