我简化了应用程序的描述,使查询更加清晰。应用程序存储已保存phrases
。这些短语每个都分配了category
。这些短语可以是posted
users
。我的查询的英文描述:
我需要将
category
和user
传递给prepared statement
。 结果将仅包含phrases
并将category
作为参数传递。在phrases
category
的{{1}}中,只有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
,即使其中一个已在不到两周前使用相同标识符发布在同一帐户中。 / p>
我遇到困难的地方是&#34;缺席条件&#34;。这是过去两周内savedPhrase
不得存在的地方。在上一段中,我解释了缺席是如何失效的,因为postedPhrase
是基于他们自己的独立timeReposted
返回的。我似乎应该将缺席条件添加到左外连接的右侧圆圈。简化何时将条件应用于ON
与WHERE
将非常有用。
我已经努力解决这个问题一段时间了,并会欣赏任何方向。如果我可以包含任何其他信息,请告诉我。
答案 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))