Попытка добавить несколько записей с параметром while l oop в таблицу MYSQL, определенную полем, если они еще не существуют - PullRequest
1 голос
/ 22 февраля 2020

У меня есть таблица с названием «Платежи», эта таблица выглядит следующим образом

HouseNumber| Month | Amount| Status

У меня есть 104 дома для администрирования, номера go от 1 до 104, пока заплатили только 5 домов Мартовская аренда, и я сделал вставку в свою таблицу для этих.

Если вы выполните этот запрос:

SELECT * FROM Payments WHERE Month = "March"

, вы получите следующий результат

 - HouseNumber| Month | Amount| Status 
 - 1          |March  |   370 | Paid
 - 16         |March  |   370 | Paid
 - 24         |March  |   370 | Paid
 - 46         |March  |   370 | Paid
 - 99         |March  |   370 | Paid

Что я пытаюсь сделать вставку для других 99 домов со статусом «Не оплачено»

Я могу придумать несколько способов достичь этой цели, но я считаю, что ни один из них не является лучшей практикой для этого .

Я думал о том, чтобы сделать это вручную, вставив 99 инструкций или выбрав оплаченный номер housenumber и добавив их в массив PHP и сделав вставки с циклом PHP, который на самом деле пришел с запросом, но я получаю много синтаксических ошибок

DELIMITER //

CREATE PROCEDURE myproc()
BEGIN
     DECLARE i INT DEFAULT 1;

    CREATE TEMPORARY TABLE march (housenumber int);

    WHILE (i <= 104) DO

        IF i NOT IN (SELECT `housenumber` FROM Payments WHERE `Month` = "2020-03-01")
            BEGIN
                INSERT INTO March (housenumber) VALUES (i)
                SET i = i + 1
            END

    END WHILE;

    SELECT * FROM marc;
END//

DELIMITER ;

Я хочу иметь возможность сделать это только с одним запросом

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

Как прокомментировал Barmar, типичное решение включает использование таблицы чисел.

Вот запрос, который создает таблицу, которая содержит все числа от 0 до 999:

create table nums as
select n1.n + 10 * n10.n + 100 * n100.n n
from (
    select 0 n union all select 1 union all select 2 union all select 3 union all select 4
    union all select 5 union all select 6 union all select 7 union all select 8 union all select 9
) n1
cross join (
    select 0 n union all select 1 union all select 2 union all select 3 union all select 4
    union all select 5 union all select 6 union all select 7 union all select 8 union all select 9
) n10
cross join (
    select 0 n union all select 1 union all select 2 union all select 3 union all select 4
    union all select 5 union all select 6 union all select 7 union all select 8 union all select 9
) n100

Затем вы можете использовать эту таблицу для генерации «пропущенных» строк в исходной таблице:

insert into payments(house_number, month, amount, status)
select n.n, '2020-03-01', 370, 'Not Paid'
from nums n
where 
    n.n between 1 and 104
    and not exists (
        select 1 from payments p where p.month = '2020-03-01' and p.house_number = n.n
    )
1 голос
/ 22 февраля 2020

Изначально загрузите вашу таблицу со значениями по умолчанию для всех домов - от

- HouseNumber| Month | Amount| Status 
- 1          |March  |   370 | Not Paid
- 2          |March  |   370 | Not Paid
- 3          |March  |   370 | Not Paid
- 4          |March  |   370 | Not Paid
- 5          |March  |   370 | Not Paid

до 104. Затем, когда дом платит за аренду, просто обновите поле Status до Paid. Разве это не будет проще?

...