2011-10-03 8 views
0

Donc, j'ai ces 2 tables. L'un contient, appelons-les, les bogues, et l'autre contient des solutions. Un bug peut avoir plus d'une solution (ou état, si vous le pouvez), et j'aimerais obtenir le dernier.Obtenir la dernière entrée sur la jointure

En ce moment, je fais comme ça:

Select b.*, ap.approveMistakeId 
from bugs_table as b 
LEFT JOIN (select approveId, approveCause, approveDate, approveInfo, 
        approveUsername, mistakeId as approveMistakeId 
      from approve_table 
      order by approveDate desc) AS ap 
ON m.mistakeId = ap.approveMistakeId 
GROUP BY b.bugId 

Ce n'est pas une requête complète, il est juste de montrer la façon dont j'approcher. La vraie requête rejoint plus de 10 tables. Le problème avec ceci est que, avec cette sous-sélection, la requête tourne pendant environ 3.3s et renvoie ~ 2.4K enregistrements. Sans cette requête, il fonctionne sur 0.4s, ce qui est plus acceptable. J'ai créé et indexé sur approvalDate, mais cela n'a pas semblé résoudre le problème.

La solution peut-elle être une vue créée à partir de cette requête, puis jointe à cette requête? Ou y a-t-il un moyen de le faire d'une autre manière?

Merci!

+0

Uou devrait comparer les performances du sous-select. Et l'ordre n'est pas nécessaire. – ajreal

+0

Oui, le sous-select était la partie mauvaise. –

Répondre

0

Le problème est le sous-select. La solution - dénormalisation Oui, je sais, ce n'est pas la meilleure solution, mais certainement la plus rapide.

Essayé agrégat auto-tri, mais cela n'a ajouté que du temps. Pareil avec joindre avec une vue.

0

Pour joindre deux tables, vous devez essentiellement avoir une condition de jointure. Si je prends m.mistakeId = ap.approveMistakeId être b.mistakeId = ap.approveMistakeId, alors vous pouvez également opter pour une simple jointure comme:

Select b.*, ap.approveMistakeId, ap.approveDate 
from bugs_table as b 
    INNER JOIN approve_table as ap ON b.mistakeId = ap.approveMistakeId 
order by ap.approveDate desc 
Questions connexes