2016-06-03 2 views
1

J'utilise unionAll() et renvoie les données parfaitement, mais j'ai besoin d'ordernate les données et retourne toujours l'erreur parce que la colonne n'existe pas.Pourquoi une requête UNION ALL traite-t-elle la colonne ORDER externe comme inconnue?

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

Retour cette erreur:

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

+1

Chaque fois que la rencontre des erreurs SQL, vous devriez commencer avec le débogage des requêtes SQL générées, et aussi les mettre dans votre question! Veuillez également mentionner le SGBD que vous utilisez. – ndm

Répondre

2

Comme les états d'erreur, il n'y a pas de colonne date_event_start. Unlinke normal Requêtes SQL, où une colonne préfixée non-table retomberait en se référant à l'une des tables impliquées, similaire pour les résultats d'union, avec les résultats d'union, vous devez vous référer aux colonnes comme elles ont été sélectionnés.

Vous devez donc vous assurer que les colonnes sont sélectionnées sans préfixe de table ou pour sélectionner et utiliser les alias appropriés dans la clause ORDER. Afin d'éviter toute ambiguïté, je suggère fortement d'aller pour ce dernier, quelque chose comme

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

// ... 

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

// ... 

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

Il convient de noter que, au moins avec MySQL et Postgres (je ne suis pas sûr d'autres SGBD comme SQLite ou SQL Server), vous devez définir l'alias uniquement pour le premier SELECT. Le paramétrer pour toutes les sélections ne fera pas de mal, donc je l'inclue dans l'exemple, mais ce n'est pas vraiment nécessaire.

Voir aussi

+0

Merci, c'est un travail parfait. :) –