2016-12-22 4 views
1

Мне нужно запросить данные из нескольких таблиц, ниже приведены основные таблицы (упрощенные).Получить строку с min (приоритетом) из двух таблиц

Project 
+-----+-------+-------+ 
| pid | pname | status|  //status: 0 = pending, 1 = complete 
+-----+-------+-------+ 
| 1 | Proj1 | 0 | 
| 2 | Proj2 | 1 | 
| 3 | Proj3 | 0 | 
+-----+-------+-------+ 

Module 
+-----+--------+-------+----------+-----------------+ 
| mid | pid | status| priority |modulecategoryid | 
+-----+--------+-------+----------+-----------------+  
| 1 | 1 | 1 | 1  |  1   | 
| 2 | 1 | 0 | 2  |  3   | 
| 3 | 3 | 1 | 1  |  1   | 
| 4 | 3 | 0 | 2  |  3   | 
| 5 | 3 | 0 | 3  |  5   | 
+-----+--------+-------+----------+-----------------+ 

Task 
+----+--------+-------+----------+-----------------+ 
| id | mid | status| priority | taskcategoryid | 
+----+--------+-------+----------+-----------------+ 
| 1 | 2 | 1 | 2  |  2   | 
| 2 | 2 | 0 | 1  |  1   | 
| 3 | 4 | 1 | 1  |  2   | 
| 4 | 4 | 1 | 2  |  3   | 
| 5 | 4 | 0 | 3  |  4   | 
| 6 | 5 | 0 | 1  |  1   | 
+----+--------+-------+----------+-----------------+ 

Я пытаюсь выполнить ожидающие задачи для всех незавершенных проектов, которые могут быть запущены сначала на основе приоритета модуля и приоритета задачи. т.е. для Proj3, модуль с приоритетом 1 завершен, поэтому я должен получить первую приоритетную задачу для модуля 2.

Мне нужно получить самую предыдущую задачу для каждого ожидающего проекта с помощью modulecategoryid и taskcategoryid, чтобы получить соответствующую информацию, подобную этой.

+-----+--------+-----+------------------+----------------+ 
| pid | mid | tid | modulecategoryid | taskcategoryid | 
+-----+--------+-----+------------------+----------------+ 
| 1 | 2 | 2 |   3  |  2   | 
| 2 | 4 | 5 |   3  |  4   | 
+----+---------+-----+------------------+----------------+ 

Я новичок в MySql, и я попробовал запрос с несколькими объединениями и сгруппировал его с помощью projectids и min (priority), чтобы получить желаемый результат. Но столбцы, которые не входят в группу, выбираются случайным образом из совокупности.

Я видел этот ответ SQL Select only rows with Max Value on a Column, но это решает проблему для данных только в одной таблице.

Должен ли я помочь? Я могу отправить мой запрос, если это необходимо, но он получает неверные данные.

+0

Если вы все еще боретесь, см. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be -a-very-simple-sql-query – Strawberry

ответ

1

SQL Select only rows with Max Value on a Column имеет правильный подход. Вам просто нужно сделать это дважды.

Сначала создайте подзапрос a, показывающий задачу с наивысшим приоритетом для каждого модуля.

Затем создайте подзапрос b, показывающий модуль с наивысшим приоритетом для каждого проекта.

Затем присоедините свои три таблицы и два подзапроса вместе.

Вот a. Он показывает наивысший приоритет Задача id для каждого модуля mid. (http://sqlfiddle.com/#!9/7eb1f3/4/0)

SELECT Task.id, Task.mid 
    FROM Task 
    JOIN (
     SELECT MAX(priority) priority, 
       mid 
      FROM Task 
     WHERE status = 0 
      GROUP BY mid 
     ) q ON q.priority = Task.priority AND q.mid = Task.mid 

Вот b. Он работает так же, как a, и показывает модуль с наивысшим приоритетом mid для каждого проекта pid. (http://sqlfiddle.com/#!9/7eb1f3/3/0)

SELECT Module.mid, Module.pid 
    FROM Module 
    JOIN (
     SELECT MAX(priority) priority, 
       pid 
      FROM Module 
     WHERE status = 0 
      GROUP BY pid 
     ) q ON q.priority = Module.priority AND q.pid = Module.pid 

Тогда вам нужен большой РЕГИСТРИРУЙТЕСЬ тянуть все вместе. В плане это выглядит так.

SELECT Project.pid, Project.pname, 
     Module.mid, Task.id tid, 
     Module.modulecategoryid, Task.taskcategoryid 
    FROM Project 
    JOIN ( /* the subquery called b */ 
     ) b ON Project.pid = b.pid 
    JOIN Module ON b.mid = Module.mid 
    JOIN ( /* the subquery called a */ 
     ) a ON Module.mid = a.mid 
    JOIN Task ON a.id = Task.id  
WHERE Task.status = 0 

Фактический запрос выглядит следующим образом, с подзапросов положить в. (http://sqlfiddle.com/#!9/7eb1f3/2/0)

SELECT Project.pid, Project.pname, 
     Module.mid, Task.id tid, 
     Module.modulecategoryid, Task.taskcategoryid 
    FROM Project 
    JOIN ( 
      SELECT Module.mid, Module.pid 
      FROM Module 
      JOIN (
        SELECT MAX(priority) priority, pid 
        FROM Module 
        WHERE status = 0 
        GROUP BY pid 
       ) q ON q.priority = Module.priority 
         AND q.pid = Module.pid 
     ) b ON Project.pid = b.pid 
    JOIN Module ON b.mid = Module.mid 
    JOIN ( 
      SELECT Task.id, Task.mid 
      FROM Task 
      JOIN (
       SELECT MAX(priority) priority, mid 
         FROM Task 
         WHERE status = 0 
         GROUP BY mid 
       ) q ON q.priority = Task.priority 
         AND q.mid = Task.mid 
     ) a ON Module.mid = a.mid 
    JOIN Task ON a.id = Task.id  
WHERE Task.status = 0 

Секрет это понимание того, что подзапросы виртуальные таблицы, что вы можете присоединиться к друг другу или к обычным таблицам. Необходимое умение - это сортировка комбинации физических и виртуальных таблиц, которые вам нужны, и последовательности объединений.

+0

О, извините. Я пропустил что-то в вашем вопросе. Вам нужно использовать 'MIN (приоритет)' где я использовал 'MAX (приоритет)' –

+0

Hi @O.Джонс, я очень благодарен за ваши усилия, чтобы помочь! Я столкнулся с проблемой при присоединении к результатам модуля и задач, но это действительно выглядит хорошо. Это была упрощенная схема, поэтому я попробую и вернусь. –

+0

У меня есть 7 таблиц, чтобы присоединиться к результату, поэтому я попробую его позже, но я вижу, что в sqlfiddle это работает так, как я ожидал. Такой хороший ответ с объяснением. Большое спасибо! +1 & принято. –

 Смежные вопросы

  • Нет связанных вопросов^_^