簡體   English   中英

MySQL缺席情況下的外部聯接

[英]MySQL Left Outer Join with Absence Condition

概觀

我正在簡化應用程序的描述,以使查詢更清晰。 該應用程序存儲已保存的phrases 這些短語分別分配有一個category 短語可以由users posted 我的查詢的英文說明:

我需要將categoryuser傳遞到prepared statement 結果將僅包含category作為參數傳遞的phrases phrases此的category ,只有phrases將返回那里不存在此的任何發布實例phraseuser的說法timePosted領域在過去的兩個星期。

最小架構

savedPhrase

  • 短語標識符-INT無符號
  • textContent-VARCHAR
  • relatedCategory-VARCHAR
  • ___primary key是短語標識符

postedPhrase

  • savedPhrase-INT未簽名-外鍵引用savePhrase(phraseIdentifier)
  • 用戶名-VARCHAR
  • timereposted-TIMESTAMP
  • ___primary key是所有列出字段的組合

當前的最佳嘗試行為

我是自學/學習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返回的。 似乎我應該在左外部連接的右圓上添加缺席條件。 簡化何時將條件應用於ONWHERE將非常有幫助。

我已經為解決這個問題工作了一段時間,希望能對您有所幫助。 請讓我知道是否可以提供其他信息。

您無需使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM