MySQL Query 10 Tables (Sequelize или Raw Query)
Чтобы вернуть следующий пример 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, но не мог опустить его в голову и получить рабочий запрос.
Проблемы:
В конце концов, мои проблемы:
Я использую 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
Ответы
Ответ 1
Поскольку вам, похоже, нужен один набор результатов, который состоит из двух разных объединений, вы должны, вероятно, сделать что-то вроде
SELECT * from
(
SELECT 1
UNION ALL
SELECT 2
) a
ORDER by ...
Оба ваших оператора select также должны включать логическое имя в виде отдельных столбцов (например, "firstselect" ). Таким образом, вы узнаете, из какой строки выбирается ваша строка.
Ответ 2
Если вы хотите попытаться выполнить подзапрос с sequelize, вы можете использовать литерал в части вашего запроса:
User.findAll({
attributes: [
[sequelize.literal('SELECT ...'), 'subq'],
]
}).then(function(users) {
});