为什么这个 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 BYLIMIT 子句与第二个子查询相关联,而不是 UNION 的结果。那可能是你的问题。在这种情况下,当 t2.widNULL(作为外连接的结果)时,您可能还想按 t1.wid 排序,而 反之亦然.

要将 ORDER BYLIMIT 子句与整个行集相关联,您需要一个内联视图(如建议的 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 不支持。