2010-10-06 8 views
0

Je suis loin d'être un gourou mysql, j'ai donc besoin de savoir s'il existe un moyen de rendre cette requête plus rapide, plus courte et plus compacte.mysql short union

(SELECT DISTINCT(cfrm.nid), f.filename, n.title, n.created 
    FROM content_field_raamatu_marksonad cfrm 
LEFT JOIN node n ON (n.nid = cfrm.nid) 
LEFT JOIN content_field_kaanepilt cfk ON (cfk.nid = n.nid) 
LEFT JOIN files f ON (f.fid = cfk.field_kaanepilt_fid) 
    WHERE n.type = 'raamat' 
     AND n.status = 1 
     AND cfrm.field_raamatu_marksonad_value IN (102, 3348)) 
UNION 
    (SELECT DISTINCT(cfrt.nid), f.filename, n.title, n.created 
    FROM content_field_raamatu_teema cfrt 
LEFT JOIN node n ON (n.nid = cfrt.nid) 
LEFT JOIN content_field_kaanepilt cfk ON (cfk.nid = n.nid) 
LEFT JOIN files f ON (f.fid = cfk.field_kaanepilt_fid) 
    WHERE n.type = 'raamat' 
     AND n.status = 1 
     AND cfrt.field_raamatu_teema_value = 1342) 
ORDER BY `created` DESC 
+1

1. union (par opposition à union tout) fait un tri distinct, de sorte que vous n'avez pas besoin de la distincte dans chaque clause select. 2. vous êtes joint extérieurement au noeud et pourtant vous appliquez des prédicats à n.type et à n.status - la jointure externe est donc inutile –

Répondre

0

A propos de la seule façon de le réécrire est de faire l'UNION avant de faire la GAUCHE JOIN:

SELECT DISTINCT x.nid, f.filename, n.title, n.created 
    FROM (SELECT DISTINCT cfrm.nid 
      FROM content_field_raamatu_marksonad AS cfrm 
     WHERE cfrm.field_raamatu_marksonad_value IN (102, 3348) 
     UNION 
     SELECT DISTINCT cfrt.nid 
      FROM content_field_raamatu_teema AS cfrt 
     WHERE cfrt.field_raamatu_teema_value = 1342) AS x 
    LEFT JOIN node AS n ON n.nid = x.nid 
    LEFT JOIN content_field_kaanepilt AS cfk ON cfk.nid = n.nid 
    LEFT JOIN files AS f ON f.fid = cfk.field_kaanepilt_fid 
WHERE n.type = 'raamat' 
    AND n.status = 1 
ORDER BY n.created DESC; 

Cela pourrait sauver deux scans de l'extérieur tables jointes. D'un autre côté, l'optimiseur pourrait l'optimiser de cette façon - bien que je soupçonne que ce ne serait probablement pas le cas. Le remplacement des opérations LEFT JOIN par JOIN améliorerait les performances - si cela n'affecte pas la précision du résultat. Cela dépend si vous vous attendez à ce qu'il y ait un nom de fichier pour chaque ligne ou pas - du moins en partie.

+0

Cela a fait le travail, merci. – Djeux