Чтобы вернуть следующий пример 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:
- Иметь тот же Тип, что и Рабочий;
- И относятся к тому же отделу;
- А также прямые Назначение (через таблицу WA_Assignments)
Итак, мы можем отправить информацию, присутствующую в JSON, нам нужно изучить эти 10 таблиц:
- WK_Worker
- WT_WorkerType
- TY_Type
- WP_WorkPackage
- WE_WorkPackageExecution
- WS_WorkStatus
- BL_Blueprint
- PR_Project
- DP_Department
- 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
И нам нужно искать только рабочие пакеты, которые имеют тот же Тип, что и Рабочий, но мы не знаем типов перед началом работы, только после того, как посмотрим на таблица WT_WorkerType.
Я читал о subQuery, где вы можете SELECT в поле WHERE, но не мог опустить его в голову и получить рабочий запрос.
Проблемы:
В конце концов, мои проблемы:
- SQL-запрос;
Я использую Sequelize, если это может помочь, но из документов я думаю, что Raw Query будет проще.
Спасибо всем за вашу помощь и поддержку.
РЕШЕНИЕ
Вся любовь идет в @MihaiOvidiuDrăgoi (в комментариях), которая помогла мне прийти к решению
Первый SELECT получает присваивания и Вторая описанная выше логика. Этикетки помогают идентифицировать, что есть, и мы приказываем облегчить создание JSON.
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