[英]MySQL Left Outer Join with Absence Condition
我正在簡化應用程序的描述,以使查詢更清晰。 該應用程序存儲已保存的phrases
。 這些短語分別分配有一個category
。 短語可以由users
posted
。 我的查詢的英文說明:
我需要將
category
和user
傳遞到prepared statement
。 結果將僅包含category
作為參數傳遞的phrases
。 從phrases
此的category
,只有phrases
將返回那里不存在此的任何發布實例phrase
為user
的說法timePosted
領域在過去的兩個星期。
我是自學/學習MySQL的人,並且相信我在joins
很掙扎。 我認為我應該至少使用一個left outer join
,如下圖所示。 左邊的表將為savedPhrase
,右邊的表將為postedPhrase
。
SELECT * FROM savedPhrase S
LEFT JOIN postedPhrase P
ON (S.phraseIdentifier = P.savedPhrase AND P.username = ?)
WHERE
(P.savedPhrase IS NULL OR P.timeReposted < DATE_SUB(NOW(), INTERVAL 14 day)) AND
S.associatedCategory = ?
ALMOST上面的查詢有效。 但是,一旦至少在兩周前存在一個postedPhrase
行,即使少於兩個星期前將一個行以相同的標識符發布到了具有相同標識符的同一個帳戶中,它也將返回加入的savedPhrase
。
我遇到困難的地方是“缺席狀況”。 這是過去兩周內不得存在savedPhrase
地方。 在上一段中,我解釋了缺少的原因,因為postedPhrase
是基於它們自己獨立的timeReposted
返回的。 似乎我應該在左外部連接的右圓上添加缺席條件。 簡化何時將條件應用於ON
和WHERE
將非常有幫助。
我已經為解決這個問題工作了一段時間,希望能對您有所幫助。 請讓我知道是否可以提供其他信息。
您無需使用JOIN即可存檔所需的結果。 您可以根據問題的英語說明來編寫查詢。
SELECT S.*
FROM savedPhrase S
WHERE S.associatedCategory = ?
AND NOT EXISTS (SELECT 1
FROM postedPhrase P
WHERE P.username = ?
AND S.phraseIdentifier = P.savedPhrase
AND P.timeReposted >= DATE_SUB(NOW(),
INTERVAL 14 day))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.