繁体   English   中英

我如何编写 SQL 查询以从两个表中获取以下输出(使用 Nodejs)

[英]how do i write SQL Query for getting following output from two tables (With Nodejs)

表一:老师

+------+--------------+
| id   | Teacher_name |
+------+--------------+
| 1    | M       |
| 2    | S        |
+------+--------------+

表 2:学生

+------+--------------+
| id   | Subject_name |
+------+--------------+
|    1 | English      |
|    1 | Marathi      |
|    1 | Hindi        |
|    2 | Biology      |
|    2 | Physics      |
|    2 | History      |
+------+--------------+

我需要像这样的输出

[
  {
    "Teacher_name": "M",
    "Subjects": [
      {
        "Subject_name": "english"
      },
      {
        "Subject_name": "marathi"
      },
      {
        "Subject_name": "hindi"
      }
    ]
  },
  {
    "Teacher_name": "S",
    "Subjects": [
      {
        "Subject_name": "biology"
      },
      {
        "Subject_name": "physics"
      },
      {
        "Subject_name": "history"
      }
    ]
  }
]

您不能在重复的 sql 表中拥有 ID。 例如,students 表有多个 ID 为 1 和多个 ID 为 2。您可以有一个标记为“ID”的列,但实际上它不是一个 ID,但这相当于错误标记,并且会让其他任何看过的人感到困惑在桌子上。 这些表的实际结构是什么? 为了在这些表之间创建关系,您需要在学生表中有一列引用教师,因为Teachers and Students之间分别存在One to Many关系。 即,“一个老师可以有很多学生”。

+------+--------------+
| id   | Subject_name | Teacher
+------+--------------+
|    1 | English      |    1
|    2 | Marathi      |    1
|    3 | Hindi        |    1
|    4 | Biology      |    2
|    5 | Physics      |    2
|    6 | History      |    2
+------+--------------+

然后你会使用类似于这样的“内部连接”:

SELECT Subject_name, Teacher_name FROM Students INNER JOIN teacher ON (teacher.id = Students.teacher);

这将返回:

+--------------+
| Subject_name | Teacher
+--------------+
| English      |    M
| Marathi      |    M
| Hindi        |    M
| Biology      |    S
| Physics      |    S
| History      |    S
+--------------+

此外,您需要的输出需要消化该查询的输出,然后使用该信息构建一个对象或数组。 此外,“Subject_name”的任何表中都没有字段,因此除非您有备用数据源或另一个表,否则基本上必须手动填充该字段。

教师和科目之间似乎也存在one to many的关系,也就是说......“教师可以教很多科目”所以你可能需要这样的表格。

称表为“主题”

Teacher_name  |  Subject_name
     M        |    english
     M        |    marathi
     M        |    hindi
     S        |    biology
     S        |    physics
     S        |    history

然后查询将简单地select * from Subjects;

或者,如果您希望记录是唯一可识别的。

  ID  |  Subject_name  | Teacher
  1   |    english     |    1
  2   |    marathi     |    1
  3   |    hindi       |    1
  4   |    biology     |    2
  5   |    physics     |    2
  6   |    history     |    2

然后,您将使用类似的内部联接,例如:

SELECT Teacher_name, Subject_name FROM Subjects INNER JOIN teacher ON (teacher.id = Subjects.teacher);

将产生以下结果:

 Subject_name  | Teacher
   english     |    M
   marathi     |    M
   hindi       |    M
   biology     |    S
   physics     |    S
   history     |    S

node.js 部分只是创建一个连接并为其提供正确的 sql 字符串。 一个例子: https ://www.w3schools.com/nodejs/nodejs_mysql_select.asp

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers", function (err, result, fields) {
    if (err) throw err;
    console.log(result);
  });
});

不过,这一切都取决于您的表结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM