php - MySQL:获取特定时间范围内 value=0 的所有条目,除非在同一时间范围内有 value = 1 的条目

标签 php mysql sql

支付交易

+----+---------+--------+------------+
| ID | user_id | status | time_stamp |
+----+---------+--------+------------+
|  1 |    1    |    1   | 1414541884 |
|  2 |    2    |    0   | 1414576722 |
|  3 |    2    |    0   | 1414577273 |
|  4 |    3    |    0   | 1414782966 |
|  5 |    3    |    1   | 1414785691 |
|  6 |    4    |    0   | 1415112933 |
+----+---------+--------+------------+

此表存储所有付款交易。 status = 0表示付款失败,status = 1表示支付成功。

我现在想设置一个 cronjob,所有用户都会收到一条消息,他们在过去 7 天内无法购买成员(member)资格。如上面的示例表,我只需要 2 行带有 user_id , transaction_id最近付款和time_stampe最近的付款。如user_id = 3在第一次付款失败后设法获得成员(member)资格,他应该被排除在外:
+---------+----------------+------------+
| user_id | transaction_id | time_stamp |
+---------+----------------+------------+
|    2    |       3        | 1414577273 |
|    4    |       6        | 1415112933 |
+---------+----------------+------------+

是否有可能在一个查询中完成所有这些工作?如果是,它是否比使用两个查询更有效?

到目前为止我得到了什么:
SELECT DISTINCT
    `t`.`user_id`,
    `t`.`id` AS `transaction_id`,
    `t`.`time_stamp`
FROM `payment_transaction` AS `t`
WHERE
    `t`.`status` = 0
    AND `t`.`time_stamp` < UNIX_TIMESTAMP() - 60*60*24*7
ORDER BY
    `t`.`id`

但是,它不排除具有 user_id = 3 的用户。并且还给了我第一次失败的付款,而不是最近一次。

- - 编辑 - -

感谢 RST 在下面的评论中提供解决方案。经过一些额外的更改后,最终查询如下所示:
SELECT
    `t`.`user_id`,
    MAX(`t`.`id`) AS `transaction_id`,
    MAX(`t`.`time_stamp`) AS `time_stamp`
FROM `payment_transaction` AS `t`
WHERE
    `t`.`status` = 0
    AND `t`.`time_stamp` < UNIX_TIMESTAMP() - 60*60*24*7
    AND `t`.`user_id` NOT IN (
        SELECT `user_id`
        FROM `payment_transaction`
        WHERE `status` = 1
        AND UNIX_TIMESTAMP(`time_stamp`) < UNIX_TIMESTAMP() - 60*60*24*7
    )
GROUP BY
    `t`.`user_id`
ORDER BY
    `t`.`id`

最佳答案

稍微偏离您的要求,但仍应获得相同的结果,具体取决于您对应用程序的编码方式。最新交易将是最相关的假设是否准确?

如果是这样,您可以查看以下内容(未经测试):

SELECT DISTINCT
    `t`.`user_id`,
    `t`.`id` AS `transaction_id`,
    `t`.`time_stamp`
FROM `payment_transaction` AS `t`
WHERE
    `t`.`time_stamp` < UNIX_TIMESTAMP() - 60*60*24*7
GROUP BY
    `t`.`user_id`
ORDER BY
    `t`.`id`

请注意我没有测试过这个 SQL,因为我远离我的开发机器。我建议您查看 GROUP BY 命令的复杂性,以确保您不会遇到一些未捕获的边缘情况。

关于php - MySQL:获取特定时间范围内 value=0 的所有条目,除非在同一时间范围内有 value = 1 的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26754409/

相关文章:

php - 在 HTML gui 上执行 shell 命令 - 仅在本地机器上

javascript - 用 jquery 替换损坏的图像

php - html切换开关按钮点击时转到另一个页面

mysql - 搜索查询的正则表达式,如 : word1 * (word2 -word3 -word4) * word5

php - MySQL 查询返回错误值

PHP 强制 Apache 错误

php - 根据条件创建mysql更新字符串

java - 如何验证登录名/密码JDBC的正确性

sql - 嵌入定义绑定(bind)变量的 Oracle PL/SQL 代码的 Shell 脚本

SQL获取日期列表以及之前和之后的天数而不重复