powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Проверить цепочку транзакций
22 сообщений из 22, страница 1 из 1
Проверить цепочку транзакций
    #38943756
pyk81862
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица с изменениями баланса юзеров:

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 ?
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943759
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да легко.
Бери две копии таблицы, связывай по минимуму положительной разности штампов времени и проверяй, что остаток в записи из первой копии равен балансу из второй копии.
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943762
pyk81862
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно ли проверить не создавая копий таблицы?
желательно одним запросом (производительность особой роли не играет)
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943767
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pyk81862можно ли проверить не создавая копий таблицы?Насколько я понял, под двумя копиями имелось в виду два алиаса одной таблицы в одном запросе.

Кстати, еще можно попробовать с помощью переменных посчитать. Для затравки см. 7489069
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943771
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pyk81862производительность особой роли не играет

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 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
group by t1.id
) sq
where t2.id = sq.id 
and t3.payment_date = sq.payment_date
and t2.balance_after <> t3.balance_before;
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943778
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pyk81862,

не совсем понятно, как нужно считать правильно
1) amount = 200, balance_before = 0, balance_after=200;
2) amount = 25, balance_before = 200, balance_after = 175
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943781
pyk81862
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mini.weblab,
я не стал усложнять структуру, в рабочей таблицы есть поле reason, указывающее на тип операции (увеличение или уменьшение)

Akina, спасибо за ответ, тестирую
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943808
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pyk81862можно ли проверить не создавая копий таблицы?
желательно одним запросом (производительность особой роли не играет)

А кто тебе про копии таблицы говорил ?
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943818
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потренируемся :)

uid - user id
tid -transaction id
Query Output: ошибочные операции по твоему критерию
не проверяла

Код: sql
1.
2.
3.
SELECT uid, tid 
FROM transactions t1, transactions t2
WHERE t1.tid -1 = t2.tid  AND t1.balance_before <> t2.balance_after;
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943825
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,
пропустила фильтр по uid

Код: sql
1.
2.
3.
SELECT uid, tid 
FROM transactions t1, transactions t2
WHERE (t1.tid -1 = t2.tid  AND t1.uid = t2.uid) AND t1.balance_before <> t2.balance_after
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943838
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
Код: sql
1.
WHERE t1.tid -1 = t2.tid

Ню-ню...
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943839
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще я не понимаю зачем генерировать баланс
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943840
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
Akina, EXPLAIN
=)
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943864
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
уже понятно :)
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38943995
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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');
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38944000
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab, транзакция, не изменяющая баланс? Возможно, но ТС не оговорил такой случай - скорее, наоборот. Но это именно его забота - формулирование критериев определения ошибки. И в рамках данного нулевая транзакция не кажется возможной - порежется логикой.
М.б. не так - ждём ТС.
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38944010
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
:-)
в тест-примере разные пользователи, я думала, что ТС хочет что-то вроде сводки ошибочных операций по пользователям
что-то такое
user_id, operation_id
1, 2
1, 125
27, 598
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38944027
pyk81862
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinapyk81862производительность особой роли не играет

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 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
group by t1.id
) sq
where t2.id = sq.id 
and t3.payment_date = sq.payment_date
and t2.balance_after <> t3.balance_before;



ход мысли понятен, работает почти так, как я и требовалось.
единственное что он не учитывает это разных юзеров.
например так:
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;
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38944146
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabв тест-примере разные пользователи
В Вашем тест-примере. А вот у ТС юзер один.
pyk81862не учитывает это разных юзеров.
Ну так учти. Добавь соотв. поле в подзапрос и соотв. условие во внешний запрос. Делов-то...
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38944147
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pyk81862сейчас пробую сделать этот запрос для всех юзеров
Неправильно. Если у двух юзеров штампы времени транзакции совпадут, будет косяк.
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38944325
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
1) если у одного и того же юзера штампы времени совпадут - тоже будет косяк
2) запрос не работает для разных юзеров, т.к. отсутствует группировка по юзер-айди, т.е. запрос не различает пользователей
...
Рейтинг: 0 / 0
Проверить цепочку транзакций
    #38944556
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabесли у одного и того же юзера штампы времени совпадут - тоже будет косяк
Это уже косяк за пределами понятия неверной транзакции, и если такое дублирование присутствует, то свидетельствует о нарушении целостности данных. И об ошибке проектирования БД, коли уж на то пошло.

mini.weblabзапрос не работает для разных юзеров, т.к. отсутствует группировка по юзер-айди, т.е. запрос не различает пользователейВ исходной постановке задачи такого требования - различать пользователей - не было.

Компьютер, как известно, делает то, что ты просишь, а не то, что ты хочешь. Если получаешь не то - значит, учись правильно хотеть.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Проверить цепочку транзакций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]