Как выбрать значения одной таблицы на основе значений другой таблицы в SQL, PHP

#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 переменную.