#php #mysql
#php #mysql
Вопрос:
уже поздно, мой ребенок плакал весь день, и ожидается, что я справлюсь с этим в течение следующих 3 часов. У меня есть 3 таблицы MySQL «сущности», «пользователи», «привилегии» (все имеют свой идентификатор в качестве ключа).
Таблица «привилегии» содержит следующие столбцы: id (ПЕРВИЧНЫЙ КЛЮЧ), user_id, entity_id, priviledge
Дело в том, что когда…
Я предоставляю пользователю наивысшую привилегию (3). система должна создать новые записи таблицы для всех оставшихся объектов (как только вы станете «администратором» для одного объекта, вы должны быть «администратором» для всех объектов; если у вас уже должна быть привилегия (2) для какого-либо объекта, ее следует изменить на 3).
Я не могу изменить структуру SQL, и я использую PHP с PDO. Я пытался, но у меня всегда получаются повторяющиеся записи в «привилегиях», поскольку я не могу использовать INSERT IGNORE (да, все еще SQL noob).
Прямо сейчас я просто выбираю всех пользователей с привилегиями.priviledge (3), затем я выбираю все РАЗЛИЧНЫЕ entities.id и сбрасывает их в массивы PHP, а затем я перебираю каждый «пользователь» и «объект». Поэтому вместо отправки 1 запроса я заканчиваю с USERSxENTITIES и сразу же отправляю более 500 запросов.
Найдется ли милосердная душа, которая поможет мне?
Ответ №1:
Сначала из вашей структуры данных кажется, что (user_id, entity_id)
это должно быть уникальным.
Из-за ваших критериев «без изменений схемы таблицы» (в противном случае я бы удалил id (предполагается, что это auto_increment
) и добавил это в качестве первичного ключа), поэтому вместо этого создайте уникальный индекс:
CREATE UNIQUE INDEX uniq_u_e ON priviledges (user_id, entity_id)
У вас, вероятно, уже есть дубликаты, поэтому найдите существующие вопросы для удаления дубликатов, а затем добавьте этот индекс.
Я предполагаю, что у вас есть другая таблица сущностей.
Создать пользователя admin (3) для всех объектов, у которых есть id
в качестве первичного ключа объекта.
INSERT INTO priviledges( user_id, entity_id, priviledge)
SELECT 42 as user_id, id, 3
FROM entities
ON DUPLICATE KEY
UPDATE priviledge = 3
Таким образом, это гарантирует, что пользователь 42 имеет доступ администратора (3) ко всем объектам.
Комментарии:
1. Добро пожаловать, несмотря на ваше отчаяние, вы задали следующий вопрос. Я рад спасти ваш день с небольшим количеством сочувствия. Я рад, что вы кое-что узнали. Пожалуйста, позаботьтесь о себе.