为什么这个 sql 工会不 运行 我?
Why this sql union do not run for me?
'SELECT * FROM t1
LEFT JOIN t2 ON t2.wid = t1.wid
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t2.wid = t1.wid
ORDER BY t2.wid
LIMIT ' . $number;
你能帮我处理这几行代码吗?我尝试了一个多月来解决同样的问题..
正如@AbhikChakraborty 所暗示的,您应该从 ORDER BY 子句的字段名称中删除 table 别名 "t2."。您必须将联合视为本质上的:
SELECT *
FROM (SELECT *
FROM t1
LEFT JOIN t2
ON t2.wid = t1.wid
UNION
SELECT *
FROM t1
RIGHT JOIN t2
ON t2.wid = t1.wid)
LIMIT ....
ORDER BY wid
所以ORDER BY子句只能从子查询中引用公共字段名。我不熟悉 LIMIT 语法,但我怀疑它会以同样的方式工作。
最后,根据您的 mySQL 能力,您似乎可以通过完全外部联接实现此目的(如果 t1 和 t2 确实相同 tables)。
祝你好运,
炖
您没有准确解释查询遇到的问题,所以我们只能猜测。然而,正如 StewS2 所观察到的,原始查询中的 ORDER BY
和 LIMIT
子句与第二个子查询相关联,而不是 UNION
的结果。那可能是你的问题。在这种情况下,当 t2.wid
是 NULL
(作为外连接的结果)时,您可能还想按 t1.wid
排序,而 反之亦然.
要将 ORDER BY
和 LIMIT
子句与整个行集相关联,您需要一个内联视图(如建议的 StewS2)或一个临时的 table。无论哪种方式,您都必须克服列命名问题:连接结果的每一列在内联视图或临时 table 中都需要一个不同的名称,但至少对于名为 wid
的列存在冲突.如果它是自连接,那么每一列都会发生冲突。 SQL 有一个解决方案:分配不同的列别名。但是,您需要明确地这样做;您不能将它与 *
通配符结合使用。
您可能需要这样的东西:
SELECT *
FROM (
-- this is the inline view
SELECT t1.wid AS t1_wid, t1.x, t2.wid AS t2_wid, t2.y
FROM t1 LEFT JOIN t2 ON t2.wid = t1.wid
UNION
SELECT t1.wid AS t1_wid, t1.x, t2.wid AS t2_wid, t2.y
FROM t1 RIGHT JOIN t2 ON t2.wid = t1.wid
) full -- table alias required, even though it's never referenced
-- coalesce() provides the first-listed non-null value
ORDER BY COALESCE(t1_wid, t2_wid)
LIMIT 100
StewS2 也说得对,如果您可以使用完全连接,整个事情会容易得多;不幸的是,MySQL 不支持。
'SELECT * FROM t1
LEFT JOIN t2 ON t2.wid = t1.wid
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t2.wid = t1.wid
ORDER BY t2.wid
LIMIT ' . $number;
你能帮我处理这几行代码吗?我尝试了一个多月来解决同样的问题..
正如@AbhikChakraborty 所暗示的,您应该从 ORDER BY 子句的字段名称中删除 table 别名 "t2."。您必须将联合视为本质上的:
SELECT *
FROM (SELECT *
FROM t1
LEFT JOIN t2
ON t2.wid = t1.wid
UNION
SELECT *
FROM t1
RIGHT JOIN t2
ON t2.wid = t1.wid)
LIMIT ....
ORDER BY wid
所以ORDER BY子句只能从子查询中引用公共字段名。我不熟悉 LIMIT 语法,但我怀疑它会以同样的方式工作。
最后,根据您的 mySQL 能力,您似乎可以通过完全外部联接实现此目的(如果 t1 和 t2 确实相同 tables)。
祝你好运,
炖
您没有准确解释查询遇到的问题,所以我们只能猜测。然而,正如 StewS2 所观察到的,原始查询中的 ORDER BY
和 LIMIT
子句与第二个子查询相关联,而不是 UNION
的结果。那可能是你的问题。在这种情况下,当 t2.wid
是 NULL
(作为外连接的结果)时,您可能还想按 t1.wid
排序,而 反之亦然.
要将 ORDER BY
和 LIMIT
子句与整个行集相关联,您需要一个内联视图(如建议的 StewS2)或一个临时的 table。无论哪种方式,您都必须克服列命名问题:连接结果的每一列在内联视图或临时 table 中都需要一个不同的名称,但至少对于名为 wid
的列存在冲突.如果它是自连接,那么每一列都会发生冲突。 SQL 有一个解决方案:分配不同的列别名。但是,您需要明确地这样做;您不能将它与 *
通配符结合使用。
您可能需要这样的东西:
SELECT *
FROM (
-- this is the inline view
SELECT t1.wid AS t1_wid, t1.x, t2.wid AS t2_wid, t2.y
FROM t1 LEFT JOIN t2 ON t2.wid = t1.wid
UNION
SELECT t1.wid AS t1_wid, t1.x, t2.wid AS t2_wid, t2.y
FROM t1 RIGHT JOIN t2 ON t2.wid = t1.wid
) full -- table alias required, even though it's never referenced
-- coalesce() provides the first-listed non-null value
ORDER BY COALESCE(t1_wid, t2_wid)
LIMIT 100
StewS2 也说得对,如果您可以使用完全连接,整个事情会容易得多;不幸的是,MySQL 不支持。