MySQL - СЛЕДУЮЩИЙ, А НЕ В - PullRequest
0 голосов
/ 15 июня 2011

Я стараюсь избегать подзапросов из-за того, что они обычно имеют гораздо более низкую производительность, чем правильное соединение.

Это мой текущий НЕ рабочий запрос:

SELECT 
    a.`email_list_id`, a.`category_id`, a.`name`
FROM 
    `email_lists`AS a 
    LEFT JOIN `email_autoresponders` AS b 
        ON ( a.`website_id` = b.`website_id` ) 
WHERE 
    a.`website_id` = [...]
    AND a.`category_id` <> 0 
    AND a.`email_list_id` <> b.`email_list_id` 
GROUP BY 
    a.`email_list_id` 
ORDER BY a.`name`

Этот запрос работает:

SELECT 
    `email_list_id`, `category_id`, `name` 
FROM 
    `email_lists` 
WHERE 
    `website_id` = [...] 
    AND `category_id` <> 0 
    AND `email_list_id` NOT IN ( 
        SELECT 
            `email_list_id` 
        FROM 
            `email_autoresponders` 
        WHERE `website_id` = [...] 
    ) 
GROUP BY 
    `email_list_id` 
ORDER BY 
    `name` 

Есть ли способ сделать это с левым соединением? Я пробовал несколько разных вариантов.

Ответы [ 2 ]

2 голосов
/ 15 июня 2011

Немного переосмыслив, это может сработать, я верю:

SELECT 
    a.`email_list_id`, a.`category_id`, a.`name`
FROM 
    `email_lists`AS a 
    LEFT JOIN `email_autoresponders` AS b 
        ON ( a.`website_id` = b.`website_id` and a.`email_list_id` = b.`email_list_id` ) 
WHERE 
    a.`website_id` = [...]
    AND a.`category_id` <> 0 
    AND b.`email_list_id` is NULL
GROUP BY 
    a.`email_list_id` 
ORDER BY a.`name`
0 голосов
/ 15 июня 2011

Для начала добавьте проверку неравенства на email_list_id в критерии объединения вместо того, чтобы включить ее в предложение WHERE:

LEFT JOIN `email_autoresponders` AS b 
    ON ( a.`website_id` = b.`website_id` 
         AND a.`email_list_id` <> b.`email_list_id` ) 

Хотя я не уверен, что упомянутый вами сценарий требует огромных оптимизаций, это способ использовать объединение, а не подзапрос ...

...