【发布时间】:2015-02-12 01:37:32
【问题描述】:
我要疯了,试图找出这个错误。我在 MySQL 中工作,需要在一个公共列上加入两个派生表。两个表中的所有列都有别名。
方案是
stops (id, name)
route (num, company, pos, stop) 在哪里
stops.id route.stop
这些表包含城市之间的巴士路线,我想找出从“Craiglockhart”到“Sighthill”的所有路线,它们恰好需要两辆巴士(即一个换乘点)。此外,因为route 表不包含停靠点名称(只有ID),所以我们在派生表中使用一些连接来按名称引用停靠点;这只是一种方便)
所以我尝试制作两个派生表。可以在“Craiglockhart”和任何不是“Craighartlock”的车站和相同的第二个派生表但用于“Sighthill”的车站之间载人的所有路线之一。我能够让这两个表分别工作。
但是,当我尝试将它们沿所谓的中转站(即第一张表中的非 Craighartlock 站和第二张表中的非 Sighthill 站)的公共列加入时,我收到错误消息。
派生表 1:这可以正常工作并正确返回表。这里,stop_b.name 代表不是 Craiglockhart 的中转站,stop_a.name 代表 Craighill “起点”站。
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
派生表 2:相同但表别名和站点限制不同。这里stop_b.name代表中转站(不是Sighthill),stop_a.name代表Sighthill“终点”站。
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)
)
我还尝试将ON 替换为USING (name_transfer),因为我要加入派生表的列在两个派生表中都称为该列。
任何帮助将不胜感激!
【问题讨论】:
-
您需要在
SELECT后面加上括号JOIN。 -
@Barmar:即使我在第二个大 SELECT 周围添加括号,我也会收到“每个派生表必须有一个别名”错误。在我上面的编辑中,我将新的右括号放在第二个派生表的别名之后,但如果我将它移到“AS second_route”之前,我会得到同样的错误。我需要为 JOIN 提供别名吗?那会在最后一个(主要)“ON”之后发生吗?
-
您需要为新的
SELECT提供别名,例如JOIN (SELECT * ...) AS second_route。您在嵌套子查询中有别名,而不是您要加入的子查询。 -
我不知道你为什么将那些
SELECT *查询包裹在内部子查询周围。 -
SELECT * FROM (SELECT blah, blah ...)与SELECT blah, blah, ...相同
标签: mysql join inner-join