Php 联合表的语法错误

Php 联合表的语法错误,php,mysql,Php,Mysql,此查询有效 $stm = $pdo->prepare("SELECT T1.Taxon, T1.Rank, T2.Taxon, T2.Rank FROM gz_life_reptiles_new T1 LEFT JOIN gz_life_reptiles_new T2 ON T2.Taxon = T1.Taxon UNION SELECT T1.Taxon, T1.Rank, T2.Taxon, T2.Rank FROM gz_life_reptiles_new T1 RIGHT

此查询有效

$stm = $pdo->prepare("SELECT T1.Taxon, T1.Rank, T2.Taxon, T2.Rank FROM     gz_life_reptiles_new T1
LEFT JOIN gz_life_reptiles_new T2 ON T2.Taxon = T1.Taxon
UNION
SELECT T1.Taxon, T1.Rank, T2.Taxon, T2.Rank FROM gz_life_reptiles_new T1
RIGHT JOIN gz_life_reptiles T2 ON T2.Taxon = T1.Taxon");
 $stm->execute(array(
));
但是,我想将它们合并到一个名为“combined”的虚拟表中,这样我就可以执行更多操作,包括GROUPBY,类似这样的操作

$stm = $pdo->prepare("SELECT *
FROM (SELECT T1.Taxon, T1.Rank, T2.Taxon, T2.Rank FROM  gz_life_reptiles_new T1
LEFT JOIN gz_life_reptiles_new T2 ON T2.Taxon = T1.Taxon
UNION
SELECT T3.Taxon, T3.Rank, T4.Taxon, T4.Rank FROM gz_life_reptiles_new T3
RIGHT JOIN gz_life_reptiles T4 ON T4.Taxon = T3.Taxon
) AS Combined
GROUP BY Taxon");
 $stm->execute(array(
));
然而,我写得不对。我收到错误消息#1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解组合使用的正确语法 按分类单元分组 第6行的0,30'限制


有人知道我做错了什么吗?

MySQL不允许在
from
子句中对视图进行子查询。所以,只要做:

SELECT T1.Taxon, T1.Rank, T2.Taxon, T2.Rank
FROM  gz_life_reptiles_new T1 LEFT JOIN
      gz_life_reptiles_new T2
      ON T2.Taxon = T1.Taxon
UNION
SELECT T3.Taxon, T3.Rank, T4.Taxon, T4.Rank
FROM gz_life_reptiles_new T3 RIGHT JOIN
     gz_life_reptiles T4
     ON T4.Taxon = T3.Taxon;
distinct
可能满足您删除重复项的需要。如果不是,那么你就有一个挑战

编辑:

好的,这是另一种方法:

SELECT T1.Taxon, T1.Rank, T2.Taxon, T2.Rank
FROM  gz_life_reptiles_new T1 LEFT JOIN
      gz_life_reptiles_new T2
      ON T2.Taxon = T1.Taxon
UNION ALL
SELECT T3.Taxon, T3.Rank, T4.Taxon, T4.Rank
FROM gz_life_reptiles_new T3 RIGHT JOIN
     gz_life_reptiles T4
     ON T4.Taxon = T3.Taxon
WHERE NOT EXISTS (SELECT 1
                  FROM gz_life_reptiles_new T1
                  WHERE T4.Taxon = T1.Taxon
                 );

顺便问一下,您是否打算让第一个
左连接
gz\u life\u爬行动物\u new
上两次?查询的结构通常是近似于完整的外部联接,结构是:“从左联接B联合所有从B左联接a”。也就是说,两个查询中都有相同的表。

对不起,如何/在何处实现DISTINCT?@DavidBlomstrom。
union
删除重复项。但是,它正在删除所有列上的重复项,而不仅仅是第一列。实际上,它正在显示重复项。例如,如果表1的功能为“A”,而表2的功能为“A”和“B”,则它将显示“A”,然后再显示“A”和“B”。看起来它基本上显示了第一个表的所有内容,然后是第二个表的所有内容。您的第二个查询解决了这个问题。为了比较两个表,我一直在尝试MySQL的完全外部连接,而您的查询完成了这项工作。