2016-12-22 28 views
1

我需要從多個表中查詢數據,下面是主要表(簡化)。從兩個表中獲取最小(優先級)的行

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-tobe -a-very-simple-sql-query – Strawberry

回答

1

SQL Select only rows with Max Value on a Column有正確的做法。你只需要做兩次。

首先創建子查詢a,顯示每個模塊的最高優先級任務。

然後創建一個子查詢b,顯示每個項目的最高優先級模塊。

然後將您的三個表格和兩個子查詢結合在一起。

這是a。它顯示每個模塊mid的最高優先級任務id。 (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相同,併爲每個項目pid顯示最高優先級模塊mid。 (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 

然後你需要一個大的JOIN來把所有的東西放在一起。概述它看起來像這樣。

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已接受。 –