我有3個InnoDB表:電子郵件,網站和訂閱。MySQL查詢(與連接和虛擬值)
電子郵件表具有id
和email
列。
網站表具有id
和address
列。
訂閱表有id
,email_id
和website_id
列。
我想要做的是提供一封電子郵件,並返回一個列表address
和subscribed
。前者是網站表中所有地址的列表,如果提供的電子郵件地址在訂閱中發生,表中的表設置爲該網站的website_id
,否則爲0,否則爲0。但是我願意保留所有的網站,即使用戶沒有找到。
我被卡住的一點是我應該在虛擬列subscribed
的值從0變爲1時,該電子郵件具有該記錄。
這是我的查詢到目前爲止。有人知道怎麼做這個嗎?
SELECT `address`, "0" AS `subscribed`
/* 0 becomes 1 for the websites email has subscribed to */
FROM `websites` a
LEFT JOIN (
SELECT s.`website_id` FROM `subscriptions` s
RIGHT JOIN (
SELECT `id` AS `email_id` FROM `emails`
WHERE `email`='[email protected]' LIMIT 1) e
ON s.`email_id`=e.`email_id`) l
ON l.`website_id`=a.`id`
這裏是爲subscribed
列期望的值輸出示例:
- 如果
emails
表中沒有找到郵件中的所有行獲得值0 - 如果發現電子郵件在
emails
表...- 如果沒有
subscriptions
表中的所有行獲取值0 - 如果在
subscriptions
表中找到,相應的地址行獲得價值1
- 如果沒有
讓我知道,如果我不能wxplain很好。有人知道我在查詢中應該改變什麼嗎?
在此先感謝。
您應該避免使用RIGHT JOIN。他們不被認爲是很好的風格,根據我的經驗,MySQL運行它們的速度比等效的左連接慢。 – Poodlehat 2012-01-18 16:11:40
謝謝。我通常也不會使用它們,但是我迷失在這個查詢中,所以想也許......但是,感謝Joe,問題解決了。我擺脫了正確的加入:) – inhan 2012-01-18 20:28:34