Я хотел бы обновить поле в моей таблице с mysql дБ - но в следующем тексте формулировка проблемы - PullRequest
1 голос
/ 17 апреля 2020

Следующие данные объясняют как мою проблему, так и желаемый результат. Пожалуйста, посмотрите ниже для получения более подробной информации

+------------+-----+--------------+-------------------+
|    Date    | ID  | Payment Done | The Problem Field |
+------------+-----+--------------+-------------------+
| 2020-02-15 | 111 |            1 |                 0 |
| 2020-03-15 | 111 |            0 |                 0 |
| 2020-04-15 | 111 |            0 |                -1 |
| 2020-03-15 | 222 |            0 |                 0 |
| 2020-03-31 | 222 |            0 |                -1 |
| 2020-04-14 | 222 |            1 |                 0 |
| 2020-02-29 | 333 |            0 |                 0 |
| 2020-03-15 | 333 |            0 |                -1 |
| 2020-03-35 | 333 |            1 |                 0 |
| 2020-04-14 | 333 |            0 |                 0 |
+------------+-----+--------------+-------------------+

enter image description here

На рисунке приведены данные, объясняющие проблему, с которой я застрял. Для данного идентификатора, если платеж не был выполнен в дату D1, а платеж также не был выполнен в предыдущую дату D2 (D2

Так, где поле проблемы имеет значение -1, это означает, что в течение этой даты, а также во время В предыдущую дату (разница между датами не всегда одна и та же), платеж не был выполнен с указанным c ID.

Я пытался сделать это с помощью запроса и провел более полдня. Затем я использовал скрипт Python, чтобы сделать это - но мой e go еще не удовлетворен. Я хотел бы сделать это с помощью запроса - если это вообще возможно.

МОЯ ИДЕЯ:

My approach to solving was to write a query that says the following:
Take a date D1 for an ID. 
Get the Max(date) for the same ID when the date is less than D1 - meaning I'll get the immediate lesser record's date. 
Then check if "payment done" is 0 in both the rows and if yes, then update the D1 row's problem field to -1.

Кстати, я не очень разбираюсь в MySQL, и, пожалуйста, прости меня за то, что я наивный ученик. Используемая версия сервера MySQL - 5.6.41

I хотел бы, чтобы вы увидели запрос (где-то ошибка - внутренний запрос не может получить доступ к переменной внешней таблицы), который я пытался написать, чтобы сказать, что я упомянул выше:

update my_table a set the_problem_field = -1 where 0 = (select payment_done from (select payment_done from  my_table where id = a.id and date =(select max(date) from  my_table  where id = a.id and date<a.date))T) and a.payment_done = 0;

Тот же аккуратно отформатированный:

UPDATE my_table a 
SET    the_problem_field = -1 
WHERE  0 = (SELECT payment_done 
            FROM   (SELECT payment_done 
                    FROM   my_table 
                    WHERE  id = a.id 
                           AND date = (SELECT Max(date) 
                                       FROM   my_table 
                                       WHERE  id = a.id 
                                              AND date < a.date))T) 
       AND a.payment_done = 0;

Я бы хотел, чтобы кто-то помог мне с этим .... пожалуйста! Любая помощь очень ценится. Спасибо за ваше время.

1 Ответ

0 голосов
/ 20 апреля 2020

Хранимая процедура не нужна. Важнейшей частью является внутреннее соединение, которое приводит к желаемому результату.

Вы можете понять, что, «запомнив» последний идентификатор и оплату выполнено

В именах столбцов не должно быть пробелов, иначе вы всегда нужно помнить, что они всегда заключают в капсулу

UPDATE Paymnettable pt
        INNER JOIN
    (SELECT 
        `Date`,
            IF(@id = ID, IF(`Payment Done` = 1, 0, IF(@Payment_Done = 0, - 1, 0)), 0) `The Problem Field`,
            @id:=ID ID,
            @Payment_Done:=`Payment Done` 'Payment Done'
    FROM
        (SELECT 
        *
    FROM
        Paymnettable
    ORDER BY `ID` , `Date`) t1
      , (SELECT @Payment_Done:=0) t2
      , (SELECT @ID:=0) t3) pt1 
    ON pt.`Date` = pt1.`Date`
        AND pt.ID = pt1.ID 
SET 
    pt.`The Problem Field` = pt1.`The Problem Field`

Схема (MySQL v5.6)

CREATE TABLE Paymnettable (
  `Date` DATE,
  `ID` INTEGER,
  `Payment Done` INTEGER,
  `The Problem Field` INTEGER
);

INSERT INTO Paymnettable
  (`Date`, `ID`, `Payment Done`, `The Problem Field`)
VALUES
  ('2020-02-15', '111', '1', '0'),
  ('2020-03-15', '111', '0', '0'),
  ('2020-04-15', '111', '0', '0'),
  ('2020-03-15', '222', '0', '0'),
  ('2020-03-31', '222', '0', '0'),
  ('2020-04-14', '222', '1', '0'),
  ('2020-02-29', '333', '0', '0'),
  ('2020-03-15', '333', '0', '0'),
  ('2020-03-31', '333', '1', '0'),
  ('2020-04-14', '333', '0', '0');

 UPDATE Paymnettable pt
        INNER JOIN
    (SELECT 
        `Date`,
            IF(@id = ID, IF(`Payment Done` = 1, 0, IF(@Payment_Done = 0, - 1, 0)), 0) `The Problem Field`,
            @id:=ID ID,
            @Payment_Done:=`Payment Done` 'Payment Done'
    FROM
        (SELECT 
        *
    FROM
        Paymnettable
    ORDER BY `ID` , `Date`) t1, (SELECT @Payment_Done:=0) t2, (SELECT @ID:=0) t3) pt1 ON pt.`Date` = pt1.`Date`
        AND pt.ID = pt1.ID 
SET 
    pt.`The Problem Field` = pt1.`The Problem Field`

Запрос № 1

SELECT 
        *
    FROM
        Paymnettable;

| Date       | ID  | Payment Done | The Problem Field |
| ---------- | --- | ------------ | ----------------- |
| 2020-02-15 | 111 | 1            | 0                 |
| 2020-03-15 | 111 | 0            | 0                 |
| 2020-04-15 | 111 | 0            | -1                |
| 2020-03-15 | 222 | 0            | 0                 |
| 2020-03-31 | 222 | 0            | -1                |
| 2020-04-14 | 222 | 1            | 0                 |
| 2020-02-29 | 333 | 0            | 0                 |
| 2020-03-15 | 333 | 0            | -1                |
| 2020-03-31 | 333 | 1            | 0                 |
| 2020-04-14 | 333 | 0            | 0                 |

Показать на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...