问题描述
|
我试图避免子查询,因为它们通常比适当的连接具有更低的性能。
这是我当前无法正常工作的查询:
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`
有什么办法可以通过左联接做到这一点?我尝试了许多不同的选择。
解决方法
经过重新考虑后,我相信这可能会起作用:
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`
, 首先,将,3ѭ的不等式检查添加到联接条件中,而不要在WHERE子句中使用它:
LEFT JOIN `email_autoresponders` AS b
ON ( a.`website_id` = b.`website_id`
AND a.`email_list_id` <> b.`email_list_id` )
尽管我不确定您提到的方案是否需要进行大量优化,但这是使用联接而不是子查询的一种方法。