Удалить строку из базы данных, если участник больше не является частью группы

#php #mysql #mysqli #sql-delete

#php #mysql #mysqli #sql-удалить

Вопрос:

У меня есть следующий запрос, чтобы получить всех участников и некоторую информацию.

 $stmt = $conn->prepare("select m.`name`, m.`id`, m.`group_id`, p.`field_1`, g.`data1`, g.`data2`
                from members m 
                inner join pfields p on m.`id` = p.`id`
                inner join groups g on g.`g_id` = m.`group_id`
                where m.`group_id` = 1");
$stmt->execute();
$result = $stmt->get_result();
  

У меня есть следующий код для вставки новых участников в мой список участников.

 while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    //code update members
    $stmt = $conn->prepare("INSERT INTO memberlist (id, name) VALUES (?, ?)");
    $stmt->bind_param("ss", $row['id'], $row['name']);
    $stmt->execute();
}
  

Однако я заметил, что если участник больше не является частью сообщества, его имя никогда не удаляется, поскольку я только добавляю новые имена.

Удаление происходит с помощью DELETE но какой самый простой способ проверить, является ли этот участник по-прежнему частью группы в исходном запросе из members , и если больше нет, удалить участника с этим id из memberlist ? В приведенном ниже примере я хочу удалить Арнольда из списка участников, потому что его больше нет в group_id 1 в members.

 members                    memberlist
id | name   | group_id     id | name   | group_id
-----------------------    ----------------------
1  | Donald | 1            1  | Donald | 1 
13 | Jeff   | 1            13 | Jeff   | 1
25 | Arnold | 3            25 | Arnold | 1
  

Ответ №1:

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

 DELETE ml FROM memeberlist ml
LEFT JOIN members m ON m.id = ml.id
WHERE m.id IS NULL
  

Комментарии:

1. У меня это не сработало, но заставило меня задуматься, пока я не разобрался. Я добавил group_id в свою таблицу memberlist, и каждый участник с неправильным group_id я удаляю.