为什么UNION ALL查询将外部ORDER列视为未知?

时间:2016-06-03 03:11:42

标签: sql cakephp cakephp-3.0 query-builder union-all

我正在使用unionAll()并完美地返回数据,但我需要对数据进行ordernate并始终返回错误,因为该列不存在。

$events = $this->Events
    ->find('available')
    ->where([
        'Events.group_of_event_id IS NULL'
    ])
    ->select('Events.id')
    ->select('Events.name')
    ->select('Events.slug')
    ->select('Events.date_event_start')
    ->select([
        'is_group' => 0
    ]);

$groups = $this->GroupOfEvents
    ->find('available')
    ->select('GroupOfEvents.id')
    ->select('GroupOfEvents.name')
    ->select('GroupOfEvents.slug')
    ->select('GroupOfEvents.date_event_start')
    ->select([
        'is_group' => 1
    ]);

$limit = 10;
$page = 1;

if($this->request->query('limit'))
    $limit = $this->request->query('limit');

if($this->request->query('page'))
    $page = $this->request->query('page');

$offset = ($page - 1) * $limit;

$connection = ConnectionManager::get('default');
$union = $events->unionAll($groups)->epilog(
    $connection
        ->newQuery()
        ->order(['date_event_start' => 'ASC'])
        ->limit($limit)
        ->offset($offset)
);

返回此错误:

  

错误:SQLSTATE [42S22]:找不到列:1054'order clause'中的未知列'date_event_start'

1 个答案:

答案 0 :(得分:2)

如错误所述,没有date_event_start列。

Unlinke normale SQL查询,其中非表格前缀列将回退到引用其中一个涉及的表,类似的联合结果不会发生,联合结果必须明确将列引用为他们已被选中。

因此,您必须确保在没有表前缀的情况下选择列,或者在ORDER子句中选择并使用适当的别名。为了避免含糊不清,我强烈建议选择后者,例如

->select(['date_event_start_alias' => 'Events.date_event_start'])

// ...

->select(['date_event_start_alias' => 'GroupOfEvents.date_event_start'])

// ...

->order(['date_event_start_alias' => 'ASC'])

应该注意的是,至少对于MySQL和Postgres(我不确定其他DBMS如SQLite或SQL Server),实际上只需要为第一个SELECT设置别名。为所有选择设置它不会造成任何伤害,因此我将其包含在示例中,但实际上并不是必需的。

另见