2010-12-14 2 views
1

я написал этот запрос MySQL:как оптимизировать этот запрос 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 

, но я думаю, что это так глупо запрос !! Надеюсь, вы можете получить мое значение этого запроса и направить меня к написанию лучшего.

спасибо.

ответ

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 

Примечания:

  1. Создать индекс на поле parentid
  2. Если parentid это число - не поставить кавычки вокруг
+1

почему не ставьте цитаты arou n число полей? –

+0

@hd: потому что в некоторых случаях по какой-то причине mysql пытается также передать поле в char (а не char на числовой), и вы теряете возможность оптимизировать запрос по индексу. – zerkms

0

Try:

SELECT * , CASE WHEN pid IN (SELECT parentid FROM table2) THEN 1 ELSE 0 END AS haschild 
     FROM table2 
     WHERE parentid = '0' 
ORDER BY pid 
Смежные вопросы