MySQL查询10表(Sequelize或原始查询)

为了返回下面的JSON示例,我们需要查询10个表,同时查找两个表之间的值。 我的SQL知识是有限的,所以我们在这里寻求帮助。

JSON:

{ project: 1, name: "BluePrint1", description: "BluePrint 1 Description", listWorkPackages: [ { id: 1, name: "WorkPackage 1 Name", description: "WorkPackage 1 Description", type: "WorkPackage Type", department: "WorkPackage Department", status: "Workpackage work status" }, { id: 2, name: "WorkPackage 2 Name", description: "WorkPackage 2 Description", type: "WorkPackage Type", department: "WorkPackage Department", status: "Workpackage work status" } ], assignments: [ { id: 3, name: "WorkPackage 3 Name", description: "WorkPackage 3 Description", type: "WorkPackage Type", department: "WorkPackage Department", status: "Workpackage work status" } ] } 

数据库:

数据库看起来像这样( 更多细节在新标签中打开)

数据库图

逻辑:

使用WorkerID,我们希望所有的WorkPackages

  • 工人具有相同的types ;
  • 属于同一部门 ;
  • 也是直接分配的通过表WA_Assignments

所以我们可以发送JSON上的信息,我们需要查看这10个表格:

  1. WK_Worker
  2. WT_WorkerType
  3. TY_Type
  4. WP_WorkPackage
  5. WE_WorkPackageExecution
  6. WS_WorkStatus
  7. BL_Blueprint
  8. PR_Project
  9. DP_Department
  10. WA_WorkAssignments

我的问题:

我对SQL的了解仅限于JOIN:

 SELECT * FROM BL_Blueprint JOIN PR_Project ON BL_idBlueprint = PR_idBlueprint JOIN WP_WorkPackage ON BL_idBlueprint = WP_idBlueprint JOIN WE_WorkPackageExecution ON WE_idWorkPackage = WP_idWorkPackage JOIN DP_Department ON WE_idDepartment = DP_idDepartment 

而且我们只需要search与Worker有相同types的工作包,但是我们只有在查看WT_WorkerType表之后才知道types。

我读了关于subquery哪里可以在WHERE字段中select,但不能得到我的头,并得到一个工作的查询。

问题:

最后,我的问题是:

  1. SQL查询;

我使用Sequelize ,如果它可以帮助,但从文档我认为原始查询会更容易。

谢谢大家的帮助和支持。


所有的爱去@MihaiOvidiuDrăgoi(在评论),帮助我到达解决scheme

一个 SELECT获取Assignments, 第二个则获得上面的逻辑。 标签有助于确定哪个是哪个,而我们为了缓解JSON的创build。

 SELECT * FROM ((SELECT BL_Name, BL_Description, WP_Name, WP_Description, PR_idProject, WE_idWorkPackageExecution, WE_idWorkStatus, TY_TypeName, TY_Description, WS_WorkStatus, DP_Name, DP_Description, 'second_select' FROM WK_Worker, WP_WorkPackage INNER JOIN BL_Blueprint ON BL_idBlueprint = WP_idBlueprint INNER JOIN PR_Project ON PR_idBlueprint = BL_idBlueprint INNER JOIN WE_WorkPackageExecution ON WE_idWorkPackage = WP_idWorkPackage AND WE_idProject = PR_idProject INNER JOIN WS_WorkStatus ON WS_idWorkStatus = WE_idWorkStatus INNER JOIN DP_Department ON DP_idDepartment = WE_idDepartment INNER JOIN WA_WorkAssignments ON WA_idWorkPackageExecution = WE_idWorkPackageExecution INNER JOIN TY_Type ON TY_idType = WP_idType WHERE WA_idWorker = 1 AND WK_idWorker = 1) UNION ALL (SELECT BL_Name, BL_Description, WP_Name, WP_Description, PR_idProject, WE_idWorkPackageExecution, WE_idWorkStatus, TY_TypeName, TY_Description, WS_WorkStatus, DP_Name, DP_Description, 'first_select' FROM WK_Worker, WP_WorkPackage JOIN BL_Blueprint ON BL_idBlueprint = WP_idBlueprint JOIN PR_Project ON PR_idBlueprint = BL_idBlueprint JOIN WE_WorkPackageExecution ON WE_idWorkPackage = WP_idWorkPackage AND WE_idProject = PR_idProject JOIN WS_WorkStatus ON WS_idWorkStatus = WE_idWorkStatus JOIN DP_Department ON DP_idDepartment = WE_idDepartment JOIN TY_Type ON TY_idType = WP_idType WHERE WK_idWorker = 1 AND DP_idDepartment IN (SELECT WK_idDepartment FROM WK_Worker WHERE WK_idWorker = 1) AND WP_idType IN (SELECT TY_idType FROM TY_Type JOIN WT_WorkerType ON TY_idType = WT_idType WHERE WT_idWorker = 1) ) ) AS T1 ORDER BY T1.PR_idProject 

既然你似乎需要一个由两个不同的连接组成的结果集,你应该做一些类似的事情

 SELECT * from ( SELECT 1 UNION ALL SELECT 2 ) a ORDER by ... 

你的select语句也应该包括逻辑名称作为不同的列(如“firstselect”) – 这样你就可以知道你的行是从哪里来的。

如果您想尝试使用sequelize进行子查询,则可以在部分查询中使用文字:

 User.findAll({ attributes: [ [sequelize.literal('SELECT ...'), 'subq'], ] }).then(function(users) { });