MySQL左外连接缺席条件

时间:2017-05-18 07:45:51

标签: mysql join left-join

概述

我简化了应用程序的描述,使查询更加清晰。应用程序存储已保存phrases。这些短语每个都分配了category。这些短语可以是posted users。我的查询的英文描述:

  

我需要将categoryuser传递给prepared statement。   结果将仅包含phrases并将category作为参数传递。在phrases category的{​​{1}}中,只有phrases才会返回此phrase的任何已发布实例   对于过去两周内user字段的timePosted参数。

最小架构

savedPhrase

  • phraseIdentifier - INT UNSIGNED
  • textContent - VARCHAR
  • associatedCategory - VARCHAR
  • ___主键是phraseIdentifier

postedPhrase

  • savedPhrase - INT UNSIGNED - 外键引用savedPhrase(phraseIdentifier)
  • 用户名 - VARCHAR
  • timeReposted - TIMESTAMP
  • ___主键是所有列出字段的组合

当前最佳尝试行为

我自学成才/学习MySQL并相信我在与joins斗争。我想我应该使用至少一个left outer join,如下图所示。左表为savedPhrase,右表为postedPhrase

Left Outer Join

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,即使其中一个已在不到两周前使用相同标识符发布在同一帐户中。 / p>

进一步讨论

我遇到困难的地方是&#34;缺席条件&#34;。这是过去两周内savedPhrase不得存在的地方。在上一段中,我解释了缺席是如何失效的,因为postedPhrase是基于他们自己的独立timeReposted返回的。我似乎应该将缺席条件添加到左外连接的右侧圆圈。简化何时将条件应用于ONWHERE将非常有用。

我已经努力解决这个问题一段时间了,并会欣赏任何方向。如果我可以包含任何其他信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

您不必使用 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))