尝试 JOIN 两个派生表时出错

Error when trying to JOIN two derived tables

我正在努力找出这个错误。我在 MySQL 工作,需要在公共列上连接两个派生的 table。两个 table 中的所有列都带有别名,table 也是如此。

方案是

stops (id, name)

route (num, company, pos, stop) 其中

stops.id <---> route.stop

这些table包含城市之间的公交路线,我想找出从'Craiglockhart'到'Sighthill'的所有路线,正好需要两辆公交车(即一个中转站) .此外,因为 route table 不包含站点名称(仅 ID),我们在派生的 table 中使用一些连接来按名称引用站点;这只是为了方便)

所以我尝试制作两个派生的table。可以在 'Craiglockhart' 和任何非 'Craighartlock' 站之间的所有路线之一,以及 table 的第二个派生站,但 'Sighthill'。我能够让这两个 table 分开工作。

但是,当我试图沿着所谓的中转站(即第一个非 Craighartlock 站 table 和第二个非 Sighthill 站)的公共栏加入他们时,我得到一个错误。

Derived Table 1:这工作正常并且 returns table 正确。此处,stop_b.name 表示非 Craiglockhart 的中转站,stop_a.name 表示 Craighill "starting" 站。

SELECT * FROM 
    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Craiglockhart' AND 
                          stop_b.name <> 'Craiglockhart') AS first_route

派生 Table 2:相同但不同 table 别名和站点限制。这里stop_b.name代表中转站(不是Sighthill),stop_a.name代表Sighthill"ending"站。

SELECT * FROM 
    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Sighthill' AND 
                          stop_b.name <> 'Sighthill') AS second_route

但是,当我尝试沿着它们的公共“name_transfer”列(两者中 stop_b.name 的别名)加入它们时,我得到一个错误:

SELECT * FROM
(
SELECT * FROM 
    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Craiglockhart' AND 
                          stop_b.name <> 'Craiglockhart') AS first_route
JOIN

(SELECT * FROM 
    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Sighthill' AND 
                          stop_b.name <> 'Sighthill') AS second_route)

ON (first_route.name_transfer = second_route.name_transfer)
)

我也尝试用 USING (name_transfer) 替换 ON 因为我想加入派生的 tables 的列在两个派生的 tables 中都被调用.

如有任何帮助,我们将不胜感激!

当您在 FROMJOIN 子句中使用子查询时,您需要在子查询两边加上括号。您在 FROM 子句中有它,但在 JOIN 子句中没有。当您在每个子查询周围添加不​​必要的 SELECT * FROM SELECT 时,问题似乎就来了。

SELECT * FROM 
    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Craiglockhart' AND 
                          stop_b.name <> 'Craiglockhart') AS first_route
JOIN

    (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
            stop_b.name AS name_transfer FROM
               route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                    JOIN stops stop_a ON (a.stop=stop_a.id)
                    JOIN stops stop_b ON (b.stop=stop_b.id)
                    WHERE stop_a.name = 'Sighthill' AND 
                          stop_b.name <> 'Sighthill') AS second_route

ON first_route.name_transfer = second_route.name_transfer

试试这个。

SELECT * FROM
    (SELECT * FROM 
        (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
                stop_b.name AS name_transfer FROM
                   route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                        JOIN stops stop_a ON (a.stop=stop_a.id)
                        JOIN stops stop_b ON (b.stop=stop_b.id)
                        WHERE stop_a.name = 'Craiglockhart' AND 
                              stop_b.name <> 'Craiglockhart') AS first_route) AS A
    JOIN

    (SELECT * FROM 
        (SELECT a.num AS num_a, a.company AS comp_a, stop_a.name AS name_a, 
                stop_b.name AS name_transfer FROM
                   route a JOIN route b ON (a.company=b.company AND a.num=b.num)
                        JOIN stops stop_a ON (a.stop=stop_a.id)
                        JOIN stops stop_b ON (b.stop=stop_b.id)
                        WHERE stop_a.name = 'Sighthill' AND 
                              stop_b.name <> 'Sighthill') AS second_route)B
    ON (A.name_transfer = B.name_transfer)