我需要幫助解決MySQL問題。我有兩張桌子,一張叫做subscription
,另一張叫做payment
。每個訂閱都有多個付款。有些付款未啓動(0
),有些付款失敗(1
),有些付款成功(2
)。MySQL - 是否可以使用正則表達式對行進行計數?
每個訂閱都可以產生多次付款嘗試,直到獲得成功。例如:
- 第一次嘗試網絡連接問題,並得到
status = 0
- 第二次嘗試到達支付API,但信用卡數據錯誤,或沒有足夠的資金,所以它得到
status = 1
- 第三次嘗試是成功的連帶
status = 2
前兩個可以比兩個以上,事實上,它可以是這樣的:
0, 1, 0, 0, 1, 1, 1, 1, 2, 0, 0, 1, 2, 1, 0, 1, 2, 2, 2, 0, 1, 2, 1, 0, 2, 0, 2, 1, 2, 2
所以每次認購有多個付款序列(每月或經常,沒有必要日期相關的),可以通過自己的地位確定與此正則表達式[0|1]*2
,得到的東西,如:
0, 1, 0, 0, 1, 1, 1, 1, 2, // 9
0, 0, 1, 2, // 4
1, 0, 1, 2, // 4
2, // 1
2, // 1
0, 1, 2, // 3
1, 0, 2, // 3
0, 2, // 2
1, 2, // 2
2 // 1
但是,當然,由於有多個訂閱,付款行在數據庫中混合,唯一連接它們的是subscription_id
。
我需要得到的是從第一次嘗試,第二次嘗試,第三次,...第10次嘗試,10次嘗試中獲得成功支付的訂閱數量。
在上面的例子應該是:
attempts count
9 1
4 2
3 2
2 2
1 3
這可能嗎?
測試數據
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
CREATE TABLE IF NOT EXISTS `payment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`subscription_id` int(11) DEFAULT NULL,
`status` smallint(6) NOT NULL,
PRIMARY KEY (`id`),
KEY `IDX_6D28840D9A1887DC` (`subscription_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPRESSED AUTO_INCREMENT=36 ;
INSERT INTO `payment` (`id`, `subscription_id`, `status`) VALUES
(1, 1, 1),(2, 1, 2),(3, 1, 2),(4, 2, 2),(5, 3, 2),(6, 4, 2),(7, 5, 2),
(8, 6, 1),(9, 6, 2),(10, 7, 2),(11, 7, 2),(12, 8, 0),(13, 8, 1),(14, 8, 2),
(15, 8, 2),(16, 9, 1),(17, 9, 2),(18, 9, 2),(19, 9, 1),(20, 9, 2),(21, 10, 0),
(22, 10, 1),(23, 10, 1),(24, 10, 1),(25, 10, 1),(26, 11, 0),(27, 11, 0),(28, 11, 1),
(29, 11, 1),(30, 11, 1),(31, 8, 0),(32, 8, 1),(33, 8, 2),(34, 10, 1),(35, 10, 2);
CREATE TABLE IF NOT EXISTS `subscription` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` smallint(6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPRESSED AUTO_INCREMENT=12 ;
INSERT INTO `subscription` (`id`, `status`) VALUES
(1, 1),(2, 1),(3, 1),(4, 1),(5, 1),(6, 1),(7, 1),
(8, 1),(9, 1),(10, 0),(11, 0);
ALTER TABLE `payment`
ADD CONSTRAINT `sub_id` FOREIGN KEY (`subscription_id`) REFERENCES `subscription` (`id`);
注:測試數據不是類似於上面的例子。對於測試數據的結果應該是這樣的:
subscription_id cntAttempts [attempts counted]
1 2 1, 2,
1 1 2,
2 1 2,
3 1 2,
4 1 2,
5 1 2,
6 2 1, 2,
7 1 2,
7 1 2,
8 3 0, 1, 2,
8 1 2,
9 2 1, 2,
9 1 2,
9 2 1, 2,
10 7 0, 1, 1, 1, 1, 1, 2
11 5 0, 0, 1, 1, 1,
8 3 0, 1, 2,
對於subscription_id = 10
最後兩筆款項分別後11
和8
那些在最後插入。
預期的最終結果:
paymentAttemptsCount count
1 9
2 5
3 1
4 0
5 1
6 0
7 1
8 0
9 0
10 0
注:認購與id = 11
沒有成功付款。
對不起!我首先寫了這個例子,然後我創建了測試數據庫。我已經用測試數據預期的結果更新了這個問題。謝謝! –
如何計算每次訂閱的付款順序,例如,如果您對subscription_id = 1有seq1:0,2和seq2:1,2,您怎麼知道您有2次付款,每次付款2次,而不是2次付款分別有3次和1次嘗試。在分貝你會hava 0,1,2,2 –
您的問題可能類似於http://stackoverflow.com/questions/9231447/how-to-count-the-number-of-groups-returned-by -a-group-by –