2009-12-03 6 views
0

Je suis d'essayer de comprendre les causes de ce qui suit, vous pourriez peut-être me aider:déclaration mysql union avec commande par

J'ai une requête comme:

select field1,fieldDate from table1 
union all 
select field1,fieldDate from table2 
order by fieldDate desc 

et une autre comme celle-ci: Donc, fondamentalement, ils sont identiques à l'exception que dans la seconde, je récupère un champ supplémentaire.

Maintenant, les deux résultats viennent avec un ordre différent, mais juste pour les cas où les dates sont exactement les mêmes. Par exemple, il y a 2 lignes (row1, row2) avec la date 2009-11-25 09:41:55. Pour la requête 1 row1 vient avant row2 et pour la requête 2 row2 vient avant row1. Est-ce que quelqu'un sait pourquoi cela se produit?

Merci, Cordialement

Répondre

3

Le classement basé sur les champs que vous ne commandez pas explicitement est définie et l'optimiseur peut changer la commande s'il pense que cela aboutit à un meilleur plan d'exécution. Étant donné deux lignes ayant exactement la même valeur dans le champ order by, vous ne pouvez pas vous attendre à ce qu'elles soient dans un ordre particulier les unes par rapport aux autres, à moins que vous n'ordonniez explicitement par un autre champ avec des valeurs différentes.

+0

Je me demandais à ce sujet aussi, bon à savoir ... – cssmaniac

-1

EDIT: Cette réponse est fausse: l'ordre par des travaux sur l'ensemble du syndicat. Je vais laisser ici pour sauver les autres le problème :)


Votre commande ne fonctionne que sur la deuxième partie de l'union. Vous pouvez utiliser un sous-requête pour rendre l'ordonnance par le travail sur l'ensemble du syndicat:

select field1,field2,fieldDate 
from (
    select field1,field2,fieldDate 
    from table1 
    union all 
    select field1,field2,fieldDate 
    from table2 
) SubQueryName 
order by fieldDate desc 
+0

Je vois que j'ai un problème avec la structure de la requête, merci. Quoi qu'il en soit, la commande doit toujours être la même, et après avoir corrigé la requête, l'ordre est toujours différent. La seule chose que je fais différente dans les deux requêtes est le champ supplémentaire! Une idée? Merci – resig

+0

Vous ne pouvez pas garantir l'ordre des données provenant d'une requête, vous devez donc explicitement définir la clause order by. – Rippo

+0

Mais je fais la commande par. Il l'ordonne simplement différemment pour les deux requêtes. Je ne comprends pas pourquoi ... – resig

0

Pouvez-vous faire

select * from (select 
    field1,field2,fieldDate, 0 as ordercol from table1 
    union all select 
    field1,field2,fieldDate, 1 as ordercol from table2) t1 
    order by fieldDate desc, ordercol asc 
0

Directement à partir du manuel MySQl, à la commande de l'utilisateur par un syndicat, vous devez insérer des parenthèses dans les tables individuelles.

(select field1,fieldDate from table1) 
union all 
(select field1,fieldDate from table2) 
order by fieldDate desc 

Ce n'est pas les normes SQL conformes! Le code que vous avez entré devrait ordonner l'union des deux tables mais à ma grande surprise MySQL a la syntaxe ci-dessus.

L'ordre dans lequel les lignes ayant le même fieldDate sont renvoyées peut différer pour chaque exécution de requête. Habituellement, cet ordre sera le même mais vous ne devriez pas y compter. Si vous voulez un état de commande supplémentaire plus d'ordre par champs.