创建inner_join表或创建新表MySQL

时间:2016-03-01 13:44:07

标签: java mysql inner-join sql-insert

我的ClassSelector DB中有两个表:

student_id | student_name |家乡

class_id | classname |描述

我正在尝试编写一个程序,该程序将使用用户输入的student_id并允许他们从类ID列表中选择一个类。我希望应用程序将student_id,student_name,class_id,classname写入单独的表。为此,最好创建一个新表(student_x_class)并使用INSERT语句:

INSERT INTO ClassSelector.student_x_class ClassSelector.students.student_id,ClassSelector.students.student_name, ClassSelector.classes.class_id,ClassSelector.classes.classname VALUES(W, X, Y, Z);

或在classes表(student_x_class)中创建一个新列,并将其用作student_id列的外键并使用内部联接。

很抱歉,如果这令人困惑,我是MySQL的新手。任何帮助将不胜感激!

ResultSet rs3 = myStmt3.executeQuery("SELECT * FROM ClassSelector.classes WHERE class_id = " + selectedClass);
    while(rs3.next()){
                            String innerJoin = (userEnterId + " has been added to " + rs3.getString("classname") + " " + rs3.getString("class_id"));
                            System.out.println(innerJoin);
                            String student_classJoin = "INSERT INTO students_x_classes" + "(student_name, class_id, classname)" + "VALUES (?, ?, ?)";
                            PreparedStatement pStmt = con.prepareStatement(student_classJoin);
                            pStmt.setString(1, userEnterId);
                            pStmt.setString(2, rs2.getString("class_id"));
                            pStmt.setString(3, rs2.getString("classname"));
                            pStmt.executeUpdate();
                            input.close();
                        }

2 个答案:

答案 0 :(得分:2)

由于学生班级是M:N关系(意味着1名学生可以参加许多班级,1班可以有很多学生),我建议您创建包含student_x_class列的表(class_id, student_id)

然后,您可以通过简单的连接选择

选择特定学生的所有课程
SELECT *
FROM students s
  INNER JOIN student_x_class sc ON sc.student_id = s.student_id
  INNER JOIN classes c ON c.class_id = sc.class_id
WHERE s.student_id = ?

如果您希望将INSERT行放入student_x_class表格,则无需加入任何内容。只需插入class_id和student_id对(不需要该表中的类名),例如

String student_classJoin = "INSERT INTO student_x_class" + "(student_id, class_id)" + "VALUES (?, ?)";

并且不要忘记调整绑定,即删除行pStmt.setString(3, rs2.getString("classname"));

顺便说一下,这是非常基本的东西,请尝试阅读一些SQL书籍/教程来获得整个概念。

答案 1 :(得分:0)

这取决于学生阶级关系的性质。如果给定的类只与一个学生相关(让我们想象的是它的委托或类似的东西)那么类表中的外键就足够了。如果一个班级可以与多个学生相关,那么你应该考虑创建一个新的表格来建模这种关系。如果您使用第二种方法,一个好的建议是在新表中只包含两个ID。