繁体   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