为什么这个sql union不能为我运行?

时间:2015-03-31 12:36:49

标签: mysql sql database drupal union

'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;

你能帮我解决这些代码吗?我试了一个多月来解决同样的问题..

2 个答案:

答案 0 :(得分:1)

您还没有准确解释您在查询中遇到的问题,因此我们不得不猜测。但是,正如StewS2所观察到的那样,原始查询中的ORDER BYLIMIT子句与第二个子查询相关联,而不是与UNION的结果相关联。这可能是你的问题。在这种情况下,当t1.widt2.wid时({作为外部联接的结果),您可能希望按NULL订购,而反之亦然

要将ORDER BYLIMIT子句与整个行集相关联,您需要内联视图(例如建议的StewS2)或临时表。无论哪种方式,您都必须克服列命名问题:连接结果的每一列在内联视图或临时表中都需要一个不同的名称,但至少对于名为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不支持。

答案 1 :(得分:0)

正如@AbhikChakraborty所提到的那样,你应该删除表别名" t2。"来自ORDER BY子句中的字段名称。你必须像对待工会一样对待工会:

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实际上是相同的表)。

祝你好运,