根据联接查询记录未返回预期结果

时间:2019-10-21 20:35:19

标签: php mysql sql join

我正在尝试在MySQL中编写一个查询,该查询基于联接的subscription的{​​{1}}列来检索expiration条记录。

transaction可以有0个或更多subscription记录,而transaction可以为NULL或日期时间。我想检索最近6个小时内已过期的订阅,但前提是该订阅也没有具有NULL过期的事务(这意味着该订阅不会过期)。

这是我现在的查询:

transaction.expiration

日期时间比较是使用PHP设置的(格式为0000-00-00 00:00:00)

针对两个订阅进行测试:

  • 第一个交易具有一个过期的交易。这应该在结果中。
  • 第二个事务有两个事务,一个事务有一个过期的到期,另一个事务有一个NULL到期。这应该不在结果中。

    通过上面的查询,当我只想要第一个订阅时,两个订阅仍然返回。我不确定我在做什么错。很高兴提供更多信息!

1 个答案:

答案 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