我正在尝试在MySQL中编写一个查询,该查询基于联接的subscription
的{{1}}列来检索expiration
条记录。
transaction
可以有0个或更多subscription
记录,而transaction
可以为NULL或日期时间。我想检索最近6个小时内已过期的订阅,但前提是该订阅也没有具有NULL过期的事务(这意味着该订阅不会过期)。
这是我现在的查询:
transaction.expiration
日期时间比较是使用PHP设置的(格式为0000-00-00 00:00:00)
针对两个订阅进行测试:
第二个事务有两个事务,一个事务有一个过期的到期,另一个事务有一个NULL到期。这应该不在结果中。
通过上面的查询,当我只想要第一个订阅时,两个订阅仍然返回。我不确定我在做什么错。很高兴提供更多信息!
答案 0 :(得分:1)
我要检索最近6个小时内已过期的订阅。
为什么不只是做这样的事情?
SELECT DISTINCT t.subscription_id
FROM app_transactions t
WHERE t.expiration > now() - interval 6 hour;
如果将来也会到期:
SELECT DISTINCT t.subscription_id
FROM app_transactions t
WHERE t.expiration > now() - interval 6 hour AND
t.expiration < now();
编辑:
您的评论需要对该查询进行一些细微调整,基本上是GROUP BY
而不是SELECT DISTINCT
:
SELECT t.subscription_id
FROM app_transactions t
WHERE (t.expiration > now() - interval 6 hour AND
t.expiration < now()
) OR
t.expiration IS NULL
GROUP BY t.sucscription_id
HAVING SUM( t.expiration IS NULL ) = 0; -- no NULL ones