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

Why does a UNION ALL query treat the outer ORDER column as unknown?

我正在完美地使用 unionAll() 和 return 数据,但我需要整理数据并且总是 return 错误,因为该列不存在。

$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)
);

Return 这个错误:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'date_event_start' in 'order clause'

如错误所述,没有 date_event_start 列。

Unlinke normale SQL 查询,其中非 table 前缀列将退回到引用所涉及的 table 之一,联合结果不会发生类似情况,对于并集结果,您必须明确引用已 selected 的列。

因此您必须确保列 selected 没有 table 前缀,或者 select 并在 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 的别名。为所有 select 设置它不会造成任何伤害,因此我将其包含在示例中,但实际上并不是必需的。

另见