【问题标题】:ORDER BY in UNION queryUNION 查询中的 ORDER BY
【发布时间】:2011-09-20 22:36:59
【问题描述】:

我看到了解释这一点的主题,但在我的情况下它不起作用。

我有疑问

( SELECT * FROM my_table
left join table2 on table2.id = my_table.id
left join table3 on pension.age = my_table.age

  WHERE table3.id IS NULL )

UNION

( SELECT * FROM my_table
left join table2 on table2.id = my_table.id
left join table3 on pension.age = my_table.age
  WHERE my_table.id FROM 75 to 245 )

ORDER BY my_table.id ASC, table2.wage DESC, table3.compensation DESC

这不起作用说 user_table。或表 2。或表 3。没找到

当我删除它时它的说法

ORDER BY id ASC, wage DESC, compensation DESC

这有点工作,但不是预期的结果。请帮忙

【问题讨论】:

  • 而想要的结果是......?
  • 我认为“user_table”是一个错字,而您的意思是“my_table”
  • 由于联合查询仅在 WHERE 中有所不同,您可以将其编写为带有 WHERE 部分 OR-ed 的简单查询(没有联合)。
  • 如果我用 WHERE + 编写它会非常慢,或者这就是我使用联合的原因。 JohnFx 期望的结果是 ORDER BY my_table.id ASC, table2.wage DESC, table3.compensation DESC

标签: mysql sql-order-by union left-join


【解决方案1】:

是否缺少部分代码?我没有看到对 table_fired 的引用。另外,这些花括号不是用作更大查询中外部联接的一部分吗?这就是为什么我认为大部分查询丢失了,这可能是相关的。

【讨论】:

  • 修复了它,我只是从我的脑海中使用它,我不再有原始查询,我向 WHERE + OR 销毁,但它超级慢
【解决方案2】:
SELECT * FROM my_table
    left join table2 on table2.id = my_table.id
    left join table3 on pension.age = my_table.age
WHERE my_table.id IS NULL OR my_table.id FROM 75 to 245
ORDER BY my_table.id ASC, table2.wage DESC, table3.compensation DESC

我将您的“table_fired”替换为“my_table”,并将两个子选择合二为一。

【讨论】:

    【解决方案3】:

    联合操作要求您的两个查询中的每一个在其结果集中具有完全相同的列数。在 mysql 中,UNION 将始终使用 frist 查询中的列名 - 因此,如果第二个查询使用不同的列名,它们将按顺序映射到第一个查询定义的列上。

    您的ORDER BY 将在UNION 运行后应用,因此它可以引用 UNION 结果集中的列.这些列没有由组成查询中的表标识符限定(这就是为什么从 ORDER BY 子句中删除表标识符可以消除显式错误的原因)。

    除此之外,问题很可能是您的组件查询产生了多个具有相同名称的列,并且只能通过它们的表标识符来区分(例如my_table.idtable2.id)。当您使用ORDER BY id ASC ... 时,将使用哪些“id”字段?

    通过将* 替换为两个组件查询中每一个的相关列的显式列表来解决此问题。确保您选择的每一列都有一个唯一的名称。例如:

    SELECT 
      my_table.id as my_table_id, 
      table2.id as table2_id, 
      table2.compensation as compensation,
      table3.wage as wage
    ...
    

    然后,您的联合将选择明确命名的列,并且您的 order by 子句需要引用这些列,而不是原始查询中的表限定列:

    ORDER BY my_table_id ASC, wage DESC, compensation DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2011-09-17
      • 2011-04-10
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      相关资源
      最近更新 更多