首页 > 解决方案 > 通过 PHP 组合 MySQL 表

问题描述

我的数据库中有以下表格:

CREATE TABLE users (
  id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  username varchar(100) NOT NULL,
  rol varchar(100) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE subjects (
  subject_id int(11) NOT NULL AUTO_INCREMENT,
  subject text,
  PRIMARY KEY (subject_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1;


CREATE TABLE users_subjects (
  users_subjects_id int(11) NOT NULL AUTO_INCREMENT,
  user_id_fk int(11),
  subject_id_fk int(11),
  FOREIGN KEY(user_id_fk) REFERENCES users(id),
  FOREIGN KEY(subject_id_fk) REFERENCES subjects(subject_id),
  PRIMARY KEY (users_subjects_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1;


   CREATE TABLE `answers` (
  `exercise_id_fk` int(11) DEFAULT NULL,
  `student_id` int(11) DEFAULT NULL,
  `difficulty_change` varchar(3) DEFAULT NULL,
  `difficulty_student` varchar(30) DEFAULT NULL,
  `choice_answer` int(11) DEFAULT NULL,
  `correct_answer` tinyint(1) DEFAULT NULL,
  KEY `exercise_id_fk` (`exercise_id_fk`),
  KEY `answers_constraint` (`student_id`),
  CONSTRAINT `answers_constraint` FOREIGN KEY (`student_id`) REFERENCES `users` (`id`),
  CONSTRAINT `answers_ibfk_1` FOREIGN KEY (`exercise_id_fk`) REFERENCES `exercises` (`exercise_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

在表' users'中可以有两种不同角色的用户:'教师'和'学生'。

此外,在表' users_subjects'中,主题与用户相关。

在我的代码中,当角色为“教师”且拥有 X 个科目的用户登录时,会出现一个表格,并显示answers与输入的教师具有相同科目的相应学生的“”表格。像这样:

$query = "select exercise_id_fk, student_id, difficulty_change, difficulty_student, correct_answer from answers
where student_id in (SELECT usAlu.user_id_fk FROM users uProf 
JOIN users_subjects usProf ON (usProf.user_id_fk = uProf.id) 
JOIN users_subjects usAlu ON (usProf.subject_id_fk = usAlu.subject_id_fk) 
JOIN users uAlu ON (usAlu.user_id_fk = uAlu.id) 
WHERE uProf.username = '".$_SESSION['username']."' 
AND uAlu.rol = 'student');";

问题是在“ student_id ”列中,它显示了学生的“ id ”,而不是用户名。我希望学生的用户名出现在“ student_id ”列中,如下例所示:

$query = "SELECT a.exercise_id_fk, u.username, a.difficulty_change, a.difficulty_student, a.correct_answer from answers
AS a JOIN users AS u ON a.student_id=u.id";

有人可以帮我解决这个问题吗?谢谢

标签: mysql

解决方案


您应该为用户添加一个联接

$query = "select a.exercise_id_fk
   , a.student_id
   , u.username
   , a.difficulty_change
   , a.difficulty_student
   , a.correct_answer 
from answers a
INNER JOIN users u ON a.student_id=u.id
where student_id in (
        ........

无论如何,您应该避免在 SQL 中使用 PHP var .. 您有 sqlijection 的风险 .. 为避免这种情况,您应该查看您的数据库驱动程序以获取准备好的语句和绑定参数


推荐阅读