我正在使用三个表处理sql数据库。
PageIds 链接 行列
我想用页面名称查询数据库并找到给定页面名称的所有链接,而且我想获得按分数排序的链接。
用于查询的PageName存在为PageA或PageB,如果是PageA,那么我需要PageBs PageName和PageBs PageScore - 反之亦然。
我知道我必须使用内连接,但我应该如何处理'或'在内部联接中如何在PageId中获取PageId,在PageIds中查询其他表然后查询PageName。
这是我尝试过的,但需要一段时间,然后我不会得到相反的PageName
select * from PageIds
inner join Links
on Links.PageAId = PageIds.PageId or Links.PageBId = PageIds.PageId
inner join Ranks
on Ranks.PageId = Links.PageBId
where PageIds.PageName = @searchternm
PageIds
为PageName匹配@searchterm
获取PageId+--------+----------+
| PageId | PageName |
+--------+----------+
| 1234 | NameA |
| 4321 | NameB |
| 3321 | NameC |
+--------+----------+
链接
如果之前找到PageId = PageAId, 然后为PageBId获取PageBId和PageName, 否则获取PageAId的PageAId和PageName
+---------+---------+
| PageAId | PageBId |
+---------+---------+
| 1234 | 3321 |
| 4321 | 3321 |
| 1234 | 4321 |
+---------+---------+
排名
如果之前找到PageId = PageAId, 然后获得PageBId的分数, 否则获得PageAId的分数
+--------+-----------+
| PageId | PageScore |
+--------+-----------+
| 1234 | 1 |
| 3321 | 4 |
| 4321 | 2 |
+--------+-----------+
如果输入是NameB,则输出应为:
PageName, Score
NodeC, 4
NodeA, 1
感谢您的帮助。
答案 0 :(得分:1)
如果我正确理解您的要求,您将要加入PageIDs表两次,一次作为PageAID,一次作为PageBID。
然后有一个查询选择pageB详细信息,其中pageB匹配,然后将其与页面A匹配的pageB详细信息的反向查询联合。
SELECT PageA.PageName, RanksA.Score FROM Links
INNER JOIN PageIDs [PageA] on Links.PageAID = PageA.PageID
INNER JOIN PageIDs [PageB] on Links.PageBID = PageB.PageID
INNER JOIN Ranks [RanksA] on Links.PageAID = RanksA.PageID
WHERE PageB.PageName = @PageName
UNION
SELECT PageB.PageName, RanksB.Score FROM Links
INNER JOIN PageIDs [PageA] on Links.PageAID = PageA.PageID
INNER JOIN PageIDs [PageB] on Links.PageBID = PageB.PageID
INNER JOIN Ranks [RanksB] on Links.PageBID = RanksB.PageID
WHERE PageA.PageName = @PageName