2010-12-14 8 views
1

je l'ai écrit cette requête mysql:comment optimiser cette requête mysql?

SELECT * , 1 AS haschild 
     FROM table2 
     WHERE parentid = '0' 
      AND pid IN (SELECT parentid FROM table2) 
UNION 
SELECT * , 0 
     FROM table2 
     WHERE parentid = '0' 
      AND pid NOT IN (SELECT parentid FROM table2) 
ORDER BY pid 

mais je pense qu'il est si stupide requête !! espérons que vous pouvez obtenir ma signification de cette requête et me guider pour en écrire un meilleur.

merci.

Répondre

2
SELECT t1.*, 
      IF(t2.parentid IS NULL, 0, 1) AS haschild 
    FROM table2 t1 
LEFT JOIN table2 t2 ON t1.pid = t2.parentid 
    WHERE t1.parentid = 0 
ORDER BY t1.pid 

Notes:

  1. Créer un index sur parentid champ
  2. Si parentid est un nombre - ne pas mettre entre guillemets
+1

pourquoi ne mettez pas de citations arou nd champs numériques? –

+0

@hd: parce que dans certains cas, mysql essaie de transformer le champ en char (pas le caractère en numérique) et vous perdez la chance d'obtenir une optimisation par index. – zerkms

0

Essayez:

SELECT * , CASE WHEN pid IN (SELECT parentid FROM table2) THEN 1 ELSE 0 END AS haschild 
     FROM table2 
     WHERE parentid = '0' 
ORDER BY pid 
Questions connexes