Php 为什么MySQL在完全外部联接时报告语法错误?

Php 为什么MySQL在完全外部联接时报告语法错误?,php,mysql,sql,join,mysql-error-1064,Php,Mysql,Sql,Join,Mysql Error 1064,上面说 您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在airlines.iaco_code=airports.iaco_code上使用接近'outer joinairports的正确语法 第4行的“完全外部连接” 语法在我看来是正确的。我以前从来没有做过很多连接,但是我需要一个表中的那些列,该表由各种id交叉引用。MySQL中没有完全外部连接。见和: 您可以使用 UNION(从MySQL 4.0.0开始): 有两个表t1、t2: SELECT airline, airp

上面说

您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在airlines.iaco_code=airports.iaco_code上使用接近'outer join
airports
的正确语法 第4行的“完全外部连接”


语法在我看来是正确的。我以前从来没有做过很多连接,但是我需要一个表中的那些列,该表由各种id交叉引用。

MySQL中没有
完全外部连接。见和:

您可以使用 UNION(从MySQL 4.0.0开始):

有两个表t1、t2:

SELECT airline, airports.icao_code, continent, country, province, city, website 

FROM airlines 
FULL OUTER JOIN airports ON airlines.iaco_code = airports.iaco_code
FULL OUTER JOIN cities ON airports.city_id = cities.city_id
FULL OUTER JOIN provinces ON cities.province_id = provinces.province_id
FULL OUTER JOIN countries ON cities.country_id = countries.country_id
FULL OUTER JOIN continents ON countries.continent_id = continents.continent_id
有三个表t1、t2、t3:

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id

克莱特斯的回答不太正确
UNION
将删除
完全外部联接将包含的重复记录。如果您需要使用类似以下内容的副本:

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t2.id = t3.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t2.id = t3.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
RIGHT JOIN t3 ON t2.id = t3.id

我刚刚为此开了个玩笑:

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t2.id = t3.id
LEFT JOIN t4 ON t3.id = t4.id
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t2.id = t3.id
LEFT JOIN t4 ON t3.id = t4.id
WHERE t1.id IS NULL
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
RIGHT JOIN t3 ON t2.id = t3.id
LEFT JOIN t4 ON t3.id = t4.id
WHERE t2.id IS NULL
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
RIGHT JOIN t3 ON t2.id = t3.id
RIGHT JOIN t4 ON t3.id = t4.id
WHERE t3.id IS NULL;

关键是,来自dual的查询是一个固定点,mysql可以将其他两个表外部连接到该表中

当您需要
完全外部连接时,只需补充这个情况
三个表t1、t2、t3。您可以让t1、t2、t3依次左键连接其余两个表,然后并集

(select 1 from DUAL) d
LEFT OUTER JOIN t1 ON t1.id = t2.id
LEFT OUTER JOIN t2 ON t1.id = t2.id

没有
FULL OUTER JOIN
语法:你有推荐的关于JOIN的教程吗?你的答案不是很正确,请参阅,或者。@Cletus,我一直在他们共享的PK列上遇到“Duplicate column name”错误……请注意,如果你够学究和理论的话,这也不是一个完美的解决方案。这种方法(使用
UNION ALL
,但检查
JOIN
ed表中的一列是否为
NULL
,以确定它不能与其他表中的任何行匹配)依赖于实际至少有一列
notnull
的表。如果没有一列保证不包含
NULL
,这种方法就行不通了。@MarkAmery:你说得对。为了使反连接正确工作,WHERE子句中的谓词需要引用一个列或表达式,如果找到匹配的行,我们知道(保证)该列或表达式将不会为NULL。在使用相等比较的连接谓词的特殊情况下,相等比较可以保证该列的值对于匹配的行不会为NULL。这不需要一个平等的比较来给我们保证。如果联接允许“匹配”行使用空值,则必须查找/使用非空表达式。@MarkAmery:此查询不依赖具有NOTNULL列的表。相反,此查询依赖于连接谓词(on子句中的条件)来保证“匹配”行中的列的值为非NULL。这取决于与NULL值一起使用时相等比较运算符的行为。(我们知道,
foo=NULL
将不会返回TRUE,即使
foo为NULL
)我希望mysql能够添加这个。可能只有5行C代码。我们每个人都必须多次编写这5行额外的代码。正在研究MySQL的人应该把它看作是一个特性请求。但是,代码< > T2在这一点上没有声明:<代码>在T1.ID= T2上的连接T1。ID < /代码>。
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t1.id = t3.id
UNION
SELECT * FROM t2
LEFT JOIN t1 ON t2.id = t1.id
LEFT JOIN t3 ON t2.id = t3.id
UNION
SELECT * FROM t3
LEFT JOIN t1 ON t3.id = t1.id
LEFT JOIN t2 ON t3.id = t2.id