[英]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.