【问题标题】:Querying records based on join not returning expected results基于联接查询记录未返回预期结果
【发布时间】:2019-10-21 20:35:19
【问题描述】:

我正在尝试在 MySQL 中编写一个查询,该查询基于加入的 transactions 的 expiration 列检索 subscription 记录。

subscription 可以有 0 个或多个 transaction 记录,transaction.expiration 可以是 NULL 或 Datetime。我想检索在过去 6 小时内过期的订阅,但前提是订阅没有过期为 NULL 的事务(这意味着订阅不会过期)。

这是我现在的查询:

SELECT subscription.id
  FROM app_subscriptions AS subscription
  JOIN (
           SELECT subscription_id
             FROM app_transactions
            WHERE (
                        expiration >= %s
                    AND expiration <= %s
                    AND expiration IS NOT NULL
                  )
         GROUP BY subscription_id
       ) as transaction
    ON subscription.id = transaction.subscription_id
 ORDER BY subscription.id DESC

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

针对两个订阅对此进行测试:

  • 第一个有一个过期的交易。这应该在结果中。

  • 第二个事务有两个事务,一个过期过期,另一个过期为 NULL。这不应该出现在结果中。

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

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)对于包含 DBMS/产品和 DDL 的 SQL,其中包括约束和索引以及表格格式的初始化。

标签: php mysql sql join


【解决方案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

【讨论】:

  • 嘿!这看起来真不错。有没有办法更新它,以便它排除任何具有null 到期交易的订阅,即使同一订阅有另一个符合条件的到期交易?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
相关资源
最近更新 更多