2010-05-10 5 views
1

Je sais cela très stupide, mais quelqu'un peut-il m'aider à comprendre ce que fait cette requête de jointure dans la description élaborée?Basic requête requête de jointure

SELECT j1.* 
FROM jos_audittrail j1 
LEFT OUTER JOIN jos_audittrail j2 
    ON (j1.trackid = j2.trackid AND j1.field = j2.field AND j1.changedone < j2.changedone) 
WHERE j1.operation = 'UPDATE' 
    AND j1.trackid=$t_ids[$n] 
    AND j2.id IS NULL 

Je sais que très stupide, mais je dois aller de l'avant avec mon plus besoin ... Pls ne me aider ...

Répondre

2

La Left Join en combinaison avec j2.id IS NULL renvoie uniquement les lignes de j1, où aucune ligne de j2 peut être trouvée.

La condition est j1.changedone < j2.changedone, il retourne uniquement les lignes avec la plus changedone par trackid (s'il y a plus d'une ligne avec cette valeur de changedone pour un trackid, tous sont retournés).


Donc, si vous avez

trackid changedone 
     1   1 
     1   2 
     2   1 

Vous obtiendrez

trackid changedone 
     1   2 
     2   1 

depuis pour 1 - 1 le Left Join trouve un enregistrement (1 - 2), donc j2.id est NOT NULL.

+0

Cela signifie que si j'ai plusieurs valeurs de trackid 1 et 2 à la fois, ils seront affichés en fonction de la valeur maximale changée d'abord, puis moins que cela et ainsi de suite ??? –

+1

@OM: Je ne sais pas si je comprends votre commentaire. Tant que 'changedone' est unique par' trackid' vous n'obtiendrez qu'une seule ligne par 'trackid', celle avec la plus grande valeur de' changedone'. –

+0

ok grt Thats ce que je voulais savoir –