【问题标题】:MySQL Using result from one query in anotherMySQL 在另一个查询中使用一个查询的结果
【发布时间】:2017-09-25 00:03:25
【问题描述】:

当用户为我的产品购买许可证时,我会尝试将剩余天数(如果他有的话)添加到新的 30 天期限。

SELECT
    SUM(DATEDIFF(access_expires, CURDATE())) + 30 as access_remaining
FROM wp_woocommerce_downloadable_product_permissions
WHERE
    user_email = 'user@mail.com' AND
    product_id = 8 AND access_expires IS NOT NULL;

UPDATE wp_woocommerce_downloadable_product_permissions
SET
    access_expires = DATE_ADD(CURDATE(), access_remaining)
WHERE
    user_email = 'user@mail.com' AND
    product_id = 8 AND
    access_expires IS NULL

似乎我无法在第二个查询中使用上一个查询中的 access_remaining。请帮助,如果可能的话不使用加入。如果有任何意义,请使用 mariadb。

【问题讨论】:

  • 你不能重复使用这样的别名。我认为最接近您的想法的是可更新的 CTE,但 MySQL 不支持。
  • 这不是和SET access_expires = DATE_ADD(access_expires,INTERVAL 30 DAY)一模一样吗?

标签: mariadb


【解决方案1】:

您似乎对这个问题施加了奇怪的限制。您是否严格使用/usr/bin/mysql,并且不能使用例如python还是java?您可以使用 := 分配给临时变量吗?为什么不加入?

考虑将 UPDATE 与相关子查询一起使用,例如 MySQL/SQL: Update with correlated subquery from the updated table itself

您选择了一种非常明智的方式来为簿记建模,即维护日历到期日期。但是考虑以不同的方式建模:您可以存储(开始、结束)客户付款的日期。您可能会发现它使某些查询更易于表达。

【讨论】:

    【解决方案2】:

    注意使用“用户变量”@ar

    SELECT
        @ar := SUM(DATEDIFF(access_expires, CURDATE())) + 30 as access_remaining
    FROM wp_woocommerce_downloadable_product_permissions
    WHERE
        user_email = 'user@mail.com' AND
        product_id = 8 AND access_expires IS NOT NULL;
    
    UPDATE wp_woocommerce_downloadable_product_permissions
    SET
        access_expires = DATE_ADD(CURDATE(), @ar)
    WHERE
        user_email = 'user@mail.com' AND
        product_id = 8 AND
        access_expires IS NULL
    

    我建议SUM 在这种情况下没有意义。

    这样做不是更简单吗?

    UPDATE wp_woocommerce_downloadable_product_permissions
    SET
        access_expires = GREATEST(access_expires, CURDATE()) + INTERVAL 30 DAY
    WHERE
        user_email = 'user@mail.com' AND
        product_id = 8 AND
        access_expires IS NULL
    

    【讨论】:

      猜你喜欢
      • 2016-04-06
      • 2013-10-05
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多