#php #mysql #sql
#php #mysql #sql
Вопрос:
У меня есть 5 таблиц:
user ( user id, user name, etc.. )
role ( role_id, role_name )
user_role ( user_id, roles_id )
form ( form_id, form_name, etc.. )
form_access ( form_id, role_id )
user
содержит все зарегистрированные пользовательские данные.role
содержит все различные типы ролей.user_role
содержит, у какого пользователя какая роль (сохраняются все назначенные роли)form
содержит все данные формы.form_access
содержит данные, например, какая роль пользователя имеет доступ к какой форме (одна форма может быть назначена многим пользовательским ролям).
Я хотел написать SQL-запрос на PHP для получения имени формы на основе зарегистрированного пользователя и его роли, например, если администратор входит в систему, он должен получить все формы, если входит HR, он должен получить формы, связанные только с HR.
Я попробовал этот запрос:
$query = "SELECT ur.role_id, f.form_name, f.form_desc
FROM user_role ur, froms f
WHERE users.id = '".$user."',
users.status ='A',
forms.form_id = form_access.form_id,
from_access.role_id = user_role.role_id,
user_role.role_id = '".$user."'";`
Кто-нибудь поможет мне с правильным запросом?
Комментарии:
1. 1. Итак, что не так? 2. Вы неправильно написали имя таблицы «из». 3. Вам даны псевдонимы таблиц, но вы их не использовали, 4. Единственными 2 таблицами в предложении FROM являются user_role и forms(/ froms), но затем вы используете form_access ( from_access) и users в вашем предложении WHERE.
2. Это отредактировано @OGHaza, но оно не работает
$qury = "SELECT ur.role_id, f.form_name, f.form_desc FROM user_role ur, froms f, users u, form_access fa WHERE users.id = '".$user."', u.status ='A', f.form_id = fa.form_id, fa.role_id = ur.role_id, ur.role_id = '".$user."'";
Ответ №1:
Поскольку вы начинаете с идентификатора пользователя, вы захотите выбрать из user_role
и ОБЪЕДИНИТЬ form_access
и form
.
SELECT `form`.`form_name` AS `form_name`
FROM `user_role` AS `ur`
INNER JOIN `form_access` AS `fa` ON `fa`.`role_id` = `ur`.`role_id`
INNER JOIN `form` AS `f` ON `f`.`form_id` = `fa`.`form_id`
WHERE `ur`.`user_id` = '".$user."'
PS: Проверьте имена таблиц и столбцов.
Ответ №2:
Вы должны использовать И .
НО это должно быть лучше с объединениями.
$query = "SELECT ur.role_id, f.form_name, f.form_desc
FROM from_access
INNER JOIN froms f ON forms.form_id = form_access.form_id
INNER JOIN user_role ur ON from_access.role_id = user_role.role_id
INNER JOIN users ON users.id = user_role.role_id
WHERE users.id = '".$user."'
AND users.status ='A' ";
Комментарии:
1. Я думаю, что условием «user_role.role_id ='».$user.»‘» должно быть «user_role.user_id = ‘».$user.»‘»
2. да, я пытаюсь отредактировать ответ, но я не могу получить данные
3. я просто хотел получить form_name из форм на основе назначенной роли зарегистрированному пользователю, у меня есть идентификатор пользователя…
Ответ №3:
Ваш запрос полностью не работает, другие, возможно, предоставили вам решения, но я собираюсь дать вам несколько советов.
Вы написали целый запрос, попробовали его, и он не удался. Я пишу запросы весь день, но если я напишу весь запрос в блокноте, а затем выполню его, в нем, вероятно, тоже где-то будет какая-то незначительная ошибка.
Начните с нуля. Вы пытаетесь получить список форм, к которым пользователь имеет доступ, поэтому давайте начнем с forms_access
таблицы. Итак, какова самая основная отправная точка? Как насчет:
SELECT fa.role_id, fa.form_id
FROM forms_access fa
Хорошо, это чрезмерно упрощено, но если это выполняется, по крайней мере, мы знаем, что подключены к базе данных.
Таким образом, мы можем легко определить, к form_id
каким ролям имеет доступ каждая роль. Теперь мы знаем, что наша таблица ссылок на users
is user_roles
, поэтому давайте добавим это в:
SELECT ur.user_id, fa.form_id, fa.role_id
FROM forms_access fa
INNER JOIN user_roles ur ON fa.role_id = ur.role_id
Итак, мы присоединились forms_access
к user_roles
по внешнему ключу role_id
. Теперь мы можем видеть для каждого, user_id
что role_id
у них есть и к каким form_id
объектам они могут получить доступ.
Итак, мы в значительной степени на месте, нам просто нужна информация из forms
таблицы, так что давайте присоединимся и к этому:
SELECT ur.user_id, f.form_name, f.form_desc, fa.form_id, fa.role_id
FROM forms_access fa
INNER JOIN user_roles ur ON ur.role_id = fa.role_id
INNER JOIN forms f ON f.form_id = ur.form_id
Отлично! Теперь у нас есть список каждой из них, form_name/form_desc
к которым каждый user_id
может получить доступ.
Попробуйте выполнить описанное выше шаг за шагом, если вы пропустите до конца, вполне может возникнуть ошибка, поскольку я не тестировал код, и я не уверен, что определения ваших таблиц соответствуют вопросу. Если вы делаете это шаг за шагом, вам нужно только проверить самую последнюю добавленную строку, чтобы найти ошибку.
Я только что заметил в вопросе, который вам также нужен users.status = 'A'
, поэтому таким же образом, как указано выше, вам нужно присоединиться к таблице users с помощью соответствующего внешнего ключа, попробуйте.
Теперь, когда вы сделали все, что вам нужно, чтобы отфильтровать результаты по определенному user_id — обратите внимание, что до этого момента мы не беспокоились о предложении WHERE.
Теперь не добавляйте какой-либо вариант WHERE user_id = '$user'
сразу, потому что тогда вы привнесете 2 потенциальные ошибки. Вместо этого попробуйте добавить WHERE user_id = 0
(или какой-нибудь известный идентификатор пользователя). Выполняется ли запрос и выглядят ли результаты корректно? Отлично, теперь, наконец, попробуйте добавить в свой php переменную.