在我的Firebird数据库中,我有两个表,在第一个(LOCATIONS)中我保留了一些位置的信息(比如在RPG游戏中),这很简单,看起来像这样:
NAME
位置1
位置2
位置3
位置4
地点5
和第二个表(CONNECTIONS)连接这些位置,所以我知道我可以从哪个位置去。情况是每一行只在一个方向连接两个位置,所以如果我想创建双向连接,我必须在CONNECTIONS表中插入两行。
一些示例连接:
first_location|second_location Location 1 | Location 2 Location 1 | Location 3 Location 2 | Location 1 Location 2 | Location 4 Location 3 | Location 1 Location 3 | Location 4 Location 4 | Location 5 Location 5 | Location 1
如您所见,这些连接是某些有向图的表示。
我需要创建一个SQL查询,它将显示我可以从给定的loc / node获取的所有位置(图形节点),此外,我是否可以返回上一个节点。 第一部分很简单,因为
select second_location
from connections
where connections.first_location = 'Location 1'
为我提供了连接到位置1的所有节点,但是当我尝试获取有关此连接的双向性的信息时,问题就开始了。
到目前为止,我尝试过这样的事情:select c.first_location as first, c.second_location as second, p.count
from connections as c
where c.first = 'Location 1'
inner join (
select count(*)
from connections
where connections.first_location = c.second
and connections.second_location = 'Location 1'
) as p
我希望得到这样的结果:
first | second | count Location 1 | Location 2 | 1 Location 1 | Location 3 | 0
但我错了。我该怎么做才能解决这个问题?
答案 0 :(得分:2)
最初发布在TS的问题中:
我不再需要帮助,不知怎的,我在发布这个问题后立即解决了这个问题。
SELECT p.first_location, p.second_location, (
SELECT COUNT (*)
FROM (
SELECT q.first_location, q.second_location
FROM connections AS c
WHERE p.first_location = q.second_location
and p.second_location = q.forst_location
)
)
FROM connections AS p
WHERE p.first_location = 'Location 1'
答案 1 :(得分:0)
你可以通过自我加入来解决这个问题:
SELECT fwd.first, fwd.second, bck.first IS NOT NULL returnable
FROM connections fwd LEFT JOIN connections bck
ON (fwd.first=bck.second AND fwd.second=bck.first)