Можно ли оптимизировать этот запрос MySQL (с подзапросами)? - PullRequest
0 голосов
/ 04 марта 2010

Есть ли лучший способ заставить этот запрос работать? Я ищу более эффективное решение, если оно есть.

SELECT `unitid`, `name` FROM apartmentunits WHERE aptid IN (
    SELECT `aptid` FROM rentconditionsmap WHERE rentcondid = 4 AND condnum = 1
) AND aptid IN (
    SELECT `aptid` FROM rentconditionsmap WHERE rentcondid = 2 AND condnum = 1
) ORDER BY name ASC 

Ответы [ 3 ]

3 голосов
/ 04 марта 2010

Я думаю, что вы хотите присоединиться здесь. Присоедините таблицу rentconditionsmap к себе и укажите условия по обе стороны от объединения. Затем объедините результаты этого запроса в apartmentunits.

(Примечание: не проверял это, может потребоваться некоторая настройка ...)

SELECT `unitid`, `name` FROM `apartmentunits` 
 WHERE `unitid` IN (
        SELECT `unitid` FROM `rentconditionsmap` r1, `rentconditionsmap` r2
         WHERE r1.`unitid` = r2.`unitid`
           AND r1.`rentcondid` = 4
           AND r1.`condnum` = 1
           AND r2.`rentcondid` = 2
           AND r2.`condnum` = 1)
 ORDER BY `name` ASC
1 голос
/ 04 марта 2010
SELECT a.`unitid`, 
       a.`name` 
FROM   apartmentunits a 
       INNER JOIN rentconditionsmap r 
       ON a.aptid = r.aptid
   AND
       r.rentcondid in (2,4)
   AND 
       r.condnum = 1
ORDER BY a.`name` 
0 голосов
/ 04 марта 2010

Да, используя соединения. Большинство СУБД оптимизируют объединение таким образом, что ему не нужно извлекать строки, которые ему не нужны. MySQL по-прежнему использует вложенные циклы, но я верю, что Oracle будет использовать хеш-соединения.

Так что этот запрос лучше выразить как

Select `unitid`, `name` FROM apartmentunits au
INNER JOIN rentconditionsmap rcm1
USING (aptid)
INNER JOIN rentconditionsmap rcm2
USING (aptid)
WHERE rcm1.rentcondid = 4
AND rcm1.condnum = 1
AND rcm2.rendcondid = 2
AND rcm2.condnum = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...