我正在努力研究如何让这个SELECT以我想要的方式工作。
我有一个UserProfile表和一个用户之间的关系表。
UserProfile
Id Name IsPulic
----------------------------
1 Tom 1
2 Adam 1
3 Harry 0
4 Billy 0
Relationships
Id UserId RelationId Confirmed
-------------------------------------------------
1 1 2 1
2 2 3 1
3 3 4 1
我正在尝试让所有Adams朋友(以及其他表中的其他数据都是为了简洁而遗漏)但我似乎无法正确理解语法。
SELECT
up.[Id],
up.[DisplayName],
up.[IsPublic]
FROM
[UserProfile] up
INNER JOIN [Relationships] rel1 ON rel1.UserId = up.[Id]
INNER JOIN [Relationships] rel2 ON rel2.RelationId = up.[Id]
WHERE
rel1.[UserId ] = 2 OR rel2.[RelationId] = 2
我在这种情况下看到的大多数示例翻转了表格,但后来我有多个引用来从UserProfile表中获取我想要的数据。
我想要的是与Adam有关系的用户列表(Id - 2),这样就会产生一个Harry(通过RelationId外键)和Tom(通过UserId外键)的列表。
最好的是获得正确的清单?
答案 0 :(得分:0)
您无需加倍JOIN
SELECT
*
FROM
[UserProfile] up
INNER JOIN [Relationships] rel1 ON rel1.UserId = up.[Id] OR rel1.RelationId = up.[Id]
WHERE
up.[Id] = 2
答案 1 :(得分:0)
试试这个:
SELECT DISTINCT
up.[Id],
up.[DisplayName],
up.[IsPublic]
FROM
[UserProfile] up
INNER JOIN [Relationships] rel1 ON rel1.UserId = up.[Id] OR rel1.RelationId = up.[Id]
WHERE
(rel1.[UserId] = 2 OR rel1.[RelationId] = 2) AND up.[Id] <> 2