2009-09-03 8 views
4

Nous avons une requête Union. Voici un exemple de base (similaire):MySQL Union Query w/Left Join - Classement par Erreur?

SELECT a.Name, b.Info 
FROM a 
LEFT JOIN b ON (a.ID = b.ID) 
WHERE a.Name LIKE "a%" 
UNION 
SELECT a.Name, b.Info 
FROM a 
LEFT JOIN b ON (a.ID = b.ID) 
WHERE a.Name LIKE "b%" 
ORDER BY a.Name, b.Info; 

Je reçois une erreur qui dit « Unknown column « b.Info » dans la« clause de l'ordre ».

Lorsque je supprime le "b.Info" de la fin de la clause ORDER BY, cela fonctionne.

Des idées?

Répondre

3

L'ordre est appliqué au jeu de résultats combiné - après que l'union a eu lieu. À ce stade, il n'y a qu'une seule table pour ainsi dire, donc la référence à b.Info sera invalide.

SELECT a.Name AS 'NameCol', b.Info AS 'InfoCol' FROM a LEFT JOIN b ON (a.ID = b.ID) WHERE 
a.Name LIKE "a%" UNION SELECT a.Name AS 'Name', b.Info AS 'Info' FROM a LEFT JOIN b ON 
(a.ID = b.ID) WHERE a.Name LIKE "b%" ORDER BY NameCol, InfoCol; 

Soyez conscient que cela pourrait être potentiellement très lent (avec de grands ensembles de résultats), comme vous obligez MySQL pour utiliser une table temporaire pour l'opération de tri.

+1

Cela ne justifie toujours pas l'utilisation de 'UNION'. – Walf

+1

En toute justice, la question n'était pas de savoir si UNION était approprié ou non, mais plutôt de manipuler (c'est-à-dire de commander) l'ensemble de données généré par UNION. – Ian

0

Je pense que lorsque vous faites UNION requête, vous devez spécifier la position de la colonne, pas de nom dans la clause ORDER BY. Essayez ORDER BY 1,2.

3

Ce problème est décrit dans la documentation MySQL (12.2.8.3 UNION Syntaxe). Vous ne pouvez pas utiliser le nom de la table d'origine, donc donner à chaque colonne un alias et utiliser celui-ci dans le ORDER BY clause:

Pour utiliser une clause ORDER PAR ou LIMITE clause pour trier ou limiter l'ensemble UNION résultat, parenthésée l'individu SELECT déclarations et placez le ORDER BY ou LIMITE après le dernier. L'exemple suivant utilise les deux clauses:

(SELECT a FROM t1 WHERE a=10 AND B=1) 
UNION 
(SELECT a FROM t2 WHERE a=11 AND B=2) 
ORDER BY a LIMIT 10; 

Ce genre de ORDER BY ne peut pas utiliser les références de colonnes qui incluent un nom de table (qui est, les noms au format nom_table.nom_col). Au lieu de cela, fournissez un alias de colonne dans la première instruction SELECT et reportez-vous à l'alias dans le ORDER BY.

1

Pourquoi utilisez-vous l'union du tout? cette requête est la même et plus rapide:

SELECT a.Name, b.Info FROM a LEFT JOIN b ON a.ID = b.ID 
WHERE (a.Name LIKE "a%" OR a.Name LIKE "b%") ORDER BY a.Name, b.Info; 

Lire sur parenthèses