SQLSelect好友查询
SQL Select friends query
我正在尝试 select 当前用户的好友,使用 returns 好友列表 table 每个好友 1 行的查询。
我有一个用户和一个朋友Table:
User(UserID, Username)
Friends(IdFirst, IdSecond)
假设我有以下用户:(1, 'Alex'), (2, 'Ana'), (3, 'Daniel')
和以下好友:(1, 2), (1,3), (2,3)
到目前为止我一直在使用这个查询:
SELECT * FROM User U
LEFT JOIN Friends F
ON U.IdUser = F.IdSecond
WHERE F.IdFirst = *LOGGED USER ID*
而且只有当我有镜像的友谊时它才有效,例如:(1, 2) (2, 1) (1, 3) (3,1)
我只想为每个友谊有一对。如果使用上面的查询,我只会得到 IdFirst 的朋友列表。
希望我说得有道理,谢谢!
工会怎么样? http://sqlfiddle.com/#!9/da447/7
SELECT * FROM users U
LEFT JOIN friends F
ON U.userid = F.idsecond
WHERE F.idfirst = *LOGGED USER ID*
UNION
SELECT * FROM users U
LEFT JOIN friends F
ON U.userid = F.idfirst
WHERE F.idsecond = *LOGGED USER ID*
为什么不简单呢?除非您需要未指定的用户字段。
SELECT idFirst
,idSecond
FROM Friends
WHERE IdFirst = *LOGGED USER ID*
OR IdSecond =*LOGGED USER ID*
这意味着你不必拥有镜像的友谊——事实上你不应该。
编辑:如果你确实想要朋友的用户,你可以在没有工会的情况下做到这一点:
SELECT *
FROM users U
WHERE UserID <> *LOGGED USER ID*
AND EXISTS(
SELECT 1
FROM Friends
WHERE (IdFirst = *LOGGED USER ID* AND IdSecond = UserID)
OR (IdSecond =*LOGGED USER ID* AND IdFirst = UserID)
)
我不确定它比@BarbaraLaird 的更好。虽然这里的执行计划看起来更简单 http://sqlfiddle.com/#!9/da447/13
首先,在从右 table 过滤的同时执行 left join
是无稽之谈,因为左连接变成了内连接。其次,你可以用连接来做到这一点,不需要 union
:
select case when u1.Id = @currentUser then u1.Id else u2.Id end as Id,
case when u1.Id = @currentUser then u1.Name else u2.Name end as Name,
from Friends f
join Users u1 on f.IdFirst u1.Id
join Users u2 on f.IdSecond u2.Id
where u1.Id = @currentUser or u2.Id = @currentUser
我正在尝试 select 当前用户的好友,使用 returns 好友列表 table 每个好友 1 行的查询。
我有一个用户和一个朋友Table:
User(UserID, Username)
Friends(IdFirst, IdSecond)
假设我有以下用户:(1, 'Alex'), (2, 'Ana'), (3, 'Daniel')
和以下好友:(1, 2), (1,3), (2,3)
到目前为止我一直在使用这个查询:
SELECT * FROM User U
LEFT JOIN Friends F
ON U.IdUser = F.IdSecond
WHERE F.IdFirst = *LOGGED USER ID*
而且只有当我有镜像的友谊时它才有效,例如:(1, 2) (2, 1) (1, 3) (3,1)
我只想为每个友谊有一对。如果使用上面的查询,我只会得到 IdFirst 的朋友列表。
希望我说得有道理,谢谢!
工会怎么样? http://sqlfiddle.com/#!9/da447/7
SELECT * FROM users U
LEFT JOIN friends F
ON U.userid = F.idsecond
WHERE F.idfirst = *LOGGED USER ID*
UNION
SELECT * FROM users U
LEFT JOIN friends F
ON U.userid = F.idfirst
WHERE F.idsecond = *LOGGED USER ID*
为什么不简单呢?除非您需要未指定的用户字段。
SELECT idFirst
,idSecond
FROM Friends
WHERE IdFirst = *LOGGED USER ID*
OR IdSecond =*LOGGED USER ID*
这意味着你不必拥有镜像的友谊——事实上你不应该。
编辑:如果你确实想要朋友的用户,你可以在没有工会的情况下做到这一点:
SELECT *
FROM users U
WHERE UserID <> *LOGGED USER ID*
AND EXISTS(
SELECT 1
FROM Friends
WHERE (IdFirst = *LOGGED USER ID* AND IdSecond = UserID)
OR (IdSecond =*LOGGED USER ID* AND IdFirst = UserID)
)
我不确定它比@BarbaraLaird 的更好。虽然这里的执行计划看起来更简单 http://sqlfiddle.com/#!9/da447/13
首先,在从右 table 过滤的同时执行 left join
是无稽之谈,因为左连接变成了内连接。其次,你可以用连接来做到这一点,不需要 union
:
select case when u1.Id = @currentUser then u1.Id else u2.Id end as Id,
case when u1.Id = @currentUser then u1.Name else u2.Name end as Name,
from Friends f
join Users u1 on f.IdFirst u1.Id
join Users u2 on f.IdSecond u2.Id
where u1.Id = @currentUser or u2.Id = @currentUser