UNION查询中的ORDER BY

时间:2011-09-20 22:36:59

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

我看过主题解释这个,但就我而言,它不起作用。

我有查询

( 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

这有点起作用,但不是理想的结果。请协助

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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”,并将两个子选项合并为一个。

答案 2 :(得分:0)

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

运行ORDER BY之后 UNION的一套。这些列由组成查询中的表标识符限定(这就是为什么从ORDER BY子句中删除表标识符可以消除显式错误。)

除此之外,问题可能是您的组件查询生成多个具有相同名称的列,并且只能通过其表标识符进行区分(例如UNIONmy_table.id)。当您使用table2.id时,将使用哪些“id”字段?

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

*

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

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