此查询有效...
$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”的虚拟表,这样我就可以执行更多操作,包括 GROUP BY 等类似的操作...
$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 服务器版本相对应的手册,了解在 ') AS 组合附近使用的正确语法 按分类单元分组 第 6 行 LIMIT 0, 30'
有人能看出我做错了什么吗?
最佳答案
MySQL 不允许在 View 的 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
);
顺便问一下,您是否打算让第一个 LEFT JOIN
出现在 gz_life_reptiles_new
上两次?查询的结构通常近似于 FULL OUTER JOIN,结构为:“FROM A LEFT JOIN B UNION ALL FROM B LEFT JOIN A”。也就是说,两个查询中都有相同的表。
关于php - 联合表的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32803925/