2014-09-10 29 views
0

我正在使用MySQL 5.5.37(InnodB引擎)。我已經讀過,出於性能方面的原因,將子查詢重寫爲涉及連接的東西可能會更好。下面是我想要運行查詢的極度簡化版本...在MySQL 5中,如何根據連接編寫「not exists」子查詢?

select m.* from msg m where  
    not (exists (select mr.ID from msg_read mr where mr.MESSAGE_ID=m.ID and mr.RECIPIENT='USER1')) and m.AUTHOR<>'USER1'; 

我無法弄清楚如何改寫「不存在」中加入的條款。有人能提供一些指導嗎?

回答

1

使用LEFT JOIN,然後測試所加入表中的匹配列是否爲NULL

SELECT DISTINCT m.* 
FROM msg AS m 
LEFT JOIN msg_read AS mr 
    ON mr.message_id = m.id AND mr.recipient = 'USER1' 
WHERE m.author <> 'USER1' 
AND mr.message_id IS NULL 
0

以下是你的查詢使用加入相當於:

SELECT DISTINCT m.* 
FROM msg m 
LEFT JOIN msg_read mr 
    ON m.ID = mr.MESSAGE_ID AND mr.RECIPIENT = 'USER1' 
WHERE mr.ID IS NULL AND m.AUTHOR <> 'USER1' 

然而,可以肯定的,您的查詢的版本效果更好,就應該運行每個通過講解和比較的執行計劃。詳情請查閱EXPLAIN manual entry。 我在MySQL上看到很多情況,其中EXISTS子查詢實際上比等效連接更快!

+0

Barmar搶先了:) – Deniz 2014-09-10 20:03:54