Mysql 选择第一次失败并在下一次尝试中成功的客户

Mysql 选择第一次失败并在下一次尝试中成功的客户,mysql,Mysql,我有一个包含两个表的数据库:用户和付款。用户和付款之间存在一对多关系:每个用户可以有一个或多个付款,并且付款属于一个用户。此外,每次付款可以是成功的,也可以是失败的 我需要创建一个查询,告诉我有多少用户第一次尝试失败,然后至少成功一次 例如: 考虑到以下用户和付款 CREATE TABLE users (`id` int, `name` varchar(6), `email` varchar(7), `password` varchar(10), `created_at` timestamp,

我有一个包含两个表的数据库:
用户
付款
。用户和付款之间存在一对多关系:每个用户可以有一个或多个付款,并且付款属于一个用户。此外,每次付款可以是成功的,也可以是失败的

我需要创建一个查询,告诉我有多少用户第一次尝试失败,然后至少成功一次

例如: 考虑到以下用户和付款

CREATE TABLE users
(`id` int, `name` varchar(6), `email` varchar(7), `password` varchar(10), `created_at` timestamp, `updated_at` timestamp);

INSERT INTO users
(`id`, `name`, `email`, `password`)
VALUES
(1, 'name 1', 'email 1', 'password 1'),
(2, 'name 2', 'email 2', 'password 2'),
(3, 'name 3', 'email 3', 'password 3'),
(4, 'name 4', 'email 4', 'password 4'),
(5, 'name 5', 'email 5', 'password 5');


CREATE TABLE payments
(`id` int, `date` varchar(10), `status` varchar(7), `user_id` int ,`created_at` timestamp, `updated_at` timestamp);

INSERT INTO payments
(`id`, `date`, `status`, `user_id`)
VALUES
(1, '2019-01-01', 'success', 1),
(2, '2019-01-01', 'failed', 2),
(3, '2019-01-01', 'failed', 3),
(4, '2019-01-01', 'success', 4),
(5, '2019-01-01', 'failed', 5),
(6, '2019-02-01', 'success', 1),
(7, '2019-02-01', 'success', 2),
(8, '2019-02-01', 'success', 3),
(9, '2019-02-01', 'success', 4),
(10, '2019-02-01', 'failed', 5),
(11, '2019-03-01', 'success', 1),
(12, '2019-03-01', 'failed', 2),
(13, '2019-03-01', 'success', 3),
(14, '2019-03-01', 'failed', 4),
(15, '2019-03-01', 'failed', 5),
(16, '2019-04-01', 'success', 1),
(17, '2019-04-01', 'failed', 2),
(18, '2019-04-01', 'failed', 3),
(19, '2019-04-01', 'failed', 4),
(20, '2019-04-01', 'failed', 5),
(21, '2019-05-01', 'success', 1),
(22, '2019-05-01', 'failed', 2),
(23, '2019-05-01', 'failed', 3),
(24, '2019-05-01', 'failed', 4),
(25, '2019-05-01', 'failed', 5),
(26, '2019-06-01', 'success', 1),
(27, '2019-06-01', 'success', 2),
(28, '2019-06-01', 'failed', 3),
(29, '2019-06-01', 'failed', 4),
(30, '2019-06-01', 'failed', 5);
我们可以看到,id为2和3的用户在
2019-01-01
上失败,但在以下日期至少有一次成功付款。我需要的查询应该返回用户2和3

这可以用纯SQL实现吗?或者我是否需要其他语言来遍历所有用户并检查他们的付款,然后只返回我想要的付款?例如,我可以用php“轻松地”完成它


提前感谢

如果您使用的是MySQL 8.0版或更高版本,则可以使用窗口功能实现所需的结果-

SELECT distinct user_id
FROM(SELECT user_id, status, LAG(status) OVER(PARTITION BY user_id ORDER BY `date`) prev_status
     FROM payments) TEMP
WHERE status = 'success'
AND prev_status = 'failed'
这是

选择不同的x.user\u id
来自付款x
联合付款
在y.user\u id=x.user\u id上
y.id
您使用的是哪个MySQL版本?版本14.14发行版5.7.27,适用于Linux(x86_64)
SELECT DISTINCT x.user_id 
           FROM payments x 
           JOIN payments y 
             ON y.user_id = x.user_id 
            AND y.id < x.id 
            AND y.status = 'failed' 
          WHERE x.status = 'success';