Подтвердить что ты не робот

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, но не мог опустить его в голову и получить рабочий запрос.

Проблемы:

В конце концов, мои проблемы:

  • 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
4b9b3361

Ответ 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) {

});