2013-07-26 6 views
1

jointures Pendant l'exécution de cette requête:Tri des résultats de

SELECT 
    a.id, 
    pub.name AS publisher_name, 
    pc.name AS placement_name, 
    b.name AS banner_name, 
    a.lead_id, 
    a.partner_id, 
    a.type, 
    l.status, 
    s.correctness, 
    a.landing_page, 
    t.name AS tracker_name, 
    a.date_view, 
    a.date_action 

FROM actions AS a 
LEFT JOIN publishers AS pub ON a.publisher_id = pub.id 
LEFT JOIN placements AS pc ON pc.publisher_id = pub.id 
LEFT JOIN banners AS b ON b.campaign_id = a.campaign_id 
LEFT JOIN leads l ON 
    l.lead_id = a.lead_id 
    AND l.created = (
     SELECT MAX(created) from leads l2 where l2.lead_id = l.lead_id 
    ) 
LEFT JOIN statuses AS s ON l.status = s.status 
LEFT JOIN trackers AS t ON t.id = a.tracker_id 
LIMIT 10 

Je suis capable de trier par toutes les colonnes de la table actions. Cependant quand j'essaye par exemple ORDER BY b.name (du banners tableau, joint sur actions.banner_id) ou ORDER BY l.lead_id (joint de leads sur l'état plus complexe comme vu ci-dessus) MySQL court l'interrogation pendant un temps loooong (la plupart des tables ont des dizaines de milliers d'enregistrements). Est-il possible, en termes de performances, de trier par colonnes jointes?

+0

Vous pouvez améliorer vos performances en ajoutant une clause where afin de ne pas essayer de trier autant d'enregistrements. –

+0

@DanBracuk, je ne pense pas que ce soit possible dans ce cas - je veux trier les résultats ici, pas les filtrer. – acid

+1

Je suppose que vous avez un index dans tous les champs où vous avez appliqué la jointure. Essayez aussi la commande 'explain' pour voir comment fonctionne la requête. – jcho360

Répondre

0

Vous pouvez d'abord filtrer (trier par, où, etc.) vos enregistrements dans une sous-requête, puis joindre le résultat au reste des tables.

1

Vous devez réécrire la requête avec une jointure interne sur la table où la colonne que vous souhaitez trier est.

Par exemple, si vous triez sur actions.banner_id

SELECT ... 
FROM actions AS a 
    JOIN banners AS b ON b.campaign_id = a.campaign_id 
    LEFT JOIN *rest of the query* 

Vous obtiendrez les mêmes résultats à moins qu'il n'y a pas assez de bannières qui peuvent être joints à l'action pour produire un total de 10 lignes.

Je suppose que ce n'est pas le cas sinon vous ne seriez pas en train de trier sur banner_id.

+0

Je ne sais pas si cela serait utile. Encore - je l'ai essayé et obtenu le même résultat - avait annuler "Query running". – acid

+0

Y a-t-il un index sur cette colonne? – Nicolas

+0

Oui, il y en a un. – acid

Questions connexes