【问题标题】:Why this sql union do not run for me?为什么这个 sql union 不为我运行?
【发布时间】:2015-03-31 12:36:49
【问题描述】:
'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;

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

【问题讨论】:

  • 什么不起作用?对此进行更多解释。以及为什么按ORDER BY watchdog.wid 的顺序引用不同的表
  • 两个查询中具有相同数据类型的列数是否相等?
  • 在两个查询中我都有一个 wid 列
  • 你在使用 MySQL 吗?
  • 是的,我正在使用 MySQL

标签: mysql sql database drupal union


【解决方案1】:

您没有准确解释查询遇到的问题,所以我们只能猜测。然而,正如 StewS2 所观察到的,原始查询中的 ORDER BY 和 LIMIT 子句与第二个子查询相关联,而不是与 UNION 的结果相关联。那可能是你的问题。在这种情况下,当t2.wid 是NULL(作为外连接的结果)并且反之亦然时,您也可能希望按t1.wid 订购。

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

【讨论】:

【解决方案2】:

正如@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 确实是同一张表)。

祝你好运,

炖菜

【讨论】:

  • MySQL 不支持完全外连接
  • 这行不通,因为有两个独立的wid 列。 ORDER BY 需要被告知使用哪个。其次,MySQL 希望所有内联视图都分配别名,即使这些别名从未使用过。
  • 抱歉,我没有注意到这两个表都有一个名为“wid”的列。所以下一个解决方案是不要从两个表中执行“SELECT *”,因为你最终会得到一个重复的列名。如果您要加入该列,则值将相等,因此您不必向 ORDER BY 子句标识您想要的。因此,请从每个表中指定您想要的所有列,并确保仅包含其中一个表中的“wid”列。然后你可以在 ORDER BY 中使用它
猜你喜欢
  • 2016-06-27
  • 1970-01-01
  • 2020-04-18
  • 2021-11-08
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
相关资源
最近更新 更多