为什么 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 设置它不会造成任何伤害,因此我将其包含在示例中,但实际上并不是必需的。
另见
我正在完美地使用 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 设置它不会造成任何伤害,因此我将其包含在示例中,但实际上并不是必需的。
另见