|
|
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
Есть таблица с изменениями баланса юзеров: id | user_id | amount | balance_before | balance_after | payment_date CREATE TABLE `transactions` ( `id` int(11) NOT NULL AUTO_INCREMENT, `payment_date` datetime NOT NULL, `amount` decimal(12,2) NOT NULL, `balance_before` decimal(12,2) NOT NULL, `balance_after` decimal(12,2) NOT NULL, `user_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; заполним ее тестовыми данными: INSERT INTO `transactions` VALUES ('1', '2015-04-22 16:44:15', '200.00', '0.00', '200.00', '5'); INSERT INTO `transactions` VALUES ('2', '2015-04-22 16:45:15', '25.00', '200.00', '175.00', '5'); INSERT INTO `transactions` VALUES ('3', '2015-04-22 16:46:15', '15.00', '175.00', '160.00', '5'); INSERT INTO `transactions` VALUES ('4', '2015-04-22 16:47:15', '20.00', '175.00', '155.00', '5'); INSERT INTO `transactions` VALUES ('5', '2015-04-22 16:48:15', '40.00', '155.00', '195.00', '5'); Как видно, произошла ошибка на транзакциях #3-#4 : баланс юзера был 175$ и должен был стать 160$, но в следующей транзакции он снова 175$ Нужно написать запрос, который проверит цепочку транзакций (для каждого юзера отдельно) и выведет ошибочные записи. Возможно ли это средствами чистого sql ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 16:58:03 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
Да легко. Бери две копии таблицы, связывай по минимуму положительной разности штампов времени и проверяй, что остаток в записи из первой копии равен балансу из второй копии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 17:00:44 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
можно ли проверить не создавая копий таблицы? желательно одним запросом (производительность особой роли не играет) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 17:02:54 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
pyk81862можно ли проверить не создавая копий таблицы?Насколько я понял, под двумя копиями имелось в виду два алиаса одной таблицы в одном запросе. Кстати, еще можно попробовать с помощью переменных посчитать. Для затравки см. 7489069 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 17:08:22 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
pyk81862производительность особой роли не играет Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 17:12:07 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
pyk81862, не совсем понятно, как нужно считать правильно 1) amount = 200, balance_before = 0, balance_after=200; 2) amount = 25, balance_before = 200, balance_after = 175 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 17:18:52 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
mini.weblab, я не стал усложнять структуру, в рабочей таблицы есть поле reason, указывающее на тип операции (увеличение или уменьшение) Akina, спасибо за ответ, тестирую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 17:25:26 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
pyk81862можно ли проверить не создавая копий таблицы? желательно одним запросом (производительность особой роли не играет) А кто тебе про копии таблицы говорил ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 17:47:36 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
потренируемся :) uid - user id tid -transaction id Query Output: ошибочные операции по твоему критерию не проверяла Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 17:57:21 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
mini.weblab, пропустила фильтр по uid Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 18:04:16 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
mini.weblab Код: sql 1. Ню-ню... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 18:16:12 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
и еще я не понимаю зачем генерировать баланс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 18:16:54 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
Akina, Akina, EXPLAIN =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 18:17:39 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
Akina, уже понятно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 18:39:48 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
Akina, тестовый пример: создаем табличку по ТС, и генерируем две записи INSERT INTO `transactions` VALUES ('1', '2015-04-22 16:00:00', '200.00', '0.00', '200.00', '1'); INSERT INTO `transactions` VALUES ('2', '2015-04-23 17:00:00', '200.00', '0.00', '200.00', '2'); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 22:40:01 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
mini.weblab, транзакция, не изменяющая баланс? Возможно, но ТС не оговорил такой случай - скорее, наоборот. Но это именно его забота - формулирование критериев определения ошибки. И в рамках данного нулевая транзакция не кажется возможной - порежется логикой. М.б. не так - ждём ТС. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 22:55:19 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
Akina, :-) в тест-примере разные пользователи, я думала, что ТС хочет что-то вроде сводки ошибочных операций по пользователям что-то такое user_id, operation_id 1, 2 1, 125 27, 598 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 23:16:38 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
Akinapyk81862производительность особой роли не играет Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ход мысли понятен, работает почти так, как я и требовалось. единственное что он не учитывает это разных юзеров. например так: INSERT INTO `transactions` VALUES ('1', '2015-04-22 16:44:15', '200.00', '0.00', '200.00', '5'); INSERT INTO `transactions` VALUES ('2', '2015-04-22 16:45:15', '25.00', '200.00', '175.00', '5'); INSERT INTO `transactions` VALUES ('3', '2015-04-22 16:46:15', '15.00', '175.00', '160.00', '5'); INSERT INTO `transactions` VALUES ('4', '2015-04-22 16:47:15', '20.00', '0.00', '20.00', '3'); INSERT INTO `transactions` VALUES ('5', '2015-04-22 16:47:15', '20.00', '175.00', '155.00', '5'); INSERT INTO `transactions` VALUES ('6', '2015-04-22 16:48:15', '20.00', '20.00', '40.00', '3'); INSERT INTO `transactions` VALUES ('7', '2015-04-22 16:48:15', '40.00', '155.00', '195.00', '5'); INSERT INTO `transactions` VALUES ('8', '2015-04-22 16:49:15', '35.00', '40.00', '5.00', '3'); mini.weblab и еще я не понимаю зачем генерировать баланс для более полной картины, так логи лучше визуализировать и отлавливать ошибки ваш запрос не нашел ошибок и ничего не вернул сейчас пробую сделать этот запрос для всех юзеров: SELECT DISTINCT t2.id FROM transactions t2, transactions t3, ( SELECT t1.id, MIN(t2.payment_date) payment_date FROM transactions t1, transactions t2 WHERE t1.payment_date < t2.payment_date AND t2.user_id=5 AND t1.user_id=5 GROUP BY t1.id ) sq WHERE t2.id = sq.id AND t3.payment_date = sq.payment_date AND t2.balance_after <> t3.balance_before; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 00:22:54 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
mini.weblabв тест-примере разные пользователи В Вашем тест-примере. А вот у ТС юзер один. pyk81862не учитывает это разных юзеров. Ну так учти. Добавь соотв. поле в подзапрос и соотв. условие во внешний запрос. Делов-то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 09:00:40 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
pyk81862сейчас пробую сделать этот запрос для всех юзеров Неправильно. Если у двух юзеров штампы времени транзакции совпадут, будет косяк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 09:02:13 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
Akina, 1) если у одного и того же юзера штампы времени совпадут - тоже будет косяк 2) запрос не работает для разных юзеров, т.к. отсутствует группировка по юзер-айди, т.е. запрос не различает пользователей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 11:33:04 |
|
||
|
Проверить цепочку транзакций
|
|||
|---|---|---|---|
|
#18+
mini.weblabесли у одного и того же юзера штампы времени совпадут - тоже будет косяк Это уже косяк за пределами понятия неверной транзакции, и если такое дублирование присутствует, то свидетельствует о нарушении целостности данных. И об ошибке проектирования БД, коли уж на то пошло. mini.weblabзапрос не работает для разных юзеров, т.к. отсутствует группировка по юзер-айди, т.е. запрос не различает пользователейВ исходной постановке задачи такого требования - различать пользователей - не было. Компьютер, как известно, делает то, что ты просишь, а не то, что ты хочешь. Если получаешь не то - значит, учись правильно хотеть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 13:43:15 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=139&tid=1833275]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 190ms |
| total: | 293ms |

| 0 / 0 |
