2016-12-22 3 views
1

Ich muss Daten aus mehreren Tabellen abfragen, unten sind die wichtigsten Tabellen (vereinfacht).Holen Sie eine Zeile mit min (Priorität) aus zwei Tabellen

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   | 
+----+--------+-------+----------+-----------------+ 

Ich versuche, die anstehenden Aufgaben für alle anstehenden Projekte zu erhalten, die erste auf der Grundlage der Modulpriorität und Task-Priorität gestartet werden kann. dh für Proj3, Modul mit Priorität 1 ist abgeschlossen, so sollte ich erste Priorität ausstehende Aufgabe für Modul 2 erhalten.

Ich muss die meisten vorherigen Aufgabe für jedes ausstehende Projekt mit modulecategoryid und taskcategoryid für die zugehörigen Informationen wie diese erhalten

Ich bin neu bei MySql und ich habe versucht, Abfrage mit mehreren Joins und gruppieren sie durch projectids und min (Priorität), um das gewünschte Ergebnis zu erhalten. Aber Spalten, die nicht in der Gruppe sind, werden zufällig aus dem Aggregat abgerufen.

Ich habe diese Antwort SQL Select only rows with Max Value on a Column gesehen, aber das löst das Problem für Daten in nur einer Tabelle.

Soll ich Hilfe dabei bekommen? Ich kann meine Abfrage bei Bedarf senden, aber es werden falsche Daten erhalten.

+0

Wenn Sie immer noch kämpfen, finden Sie unter http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be -a-sehr-einfach-sql-Abfrage – Strawberry

Antwort

1

SQL Select only rows with Max Value on a Column hat den richtigen Ansatz. Sie müssen es nur zweimal tun.

Erstellen Sie zunächst eine Unterabfrage a mit der Aufgabe mit der höchsten Priorität für jedes Modul.

Erstellen Sie dann eine Unterabfrage b mit dem Modul mit der höchsten Priorität für jedes Projekt.

Dann verbinden Sie Ihre drei Tabellen und zwei Unterabfragen zusammen.

Hier ist a. Es zeigt die höchste Priorität Aufgabe id für jedes Modul 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 

Hier b. Es funktioniert genauso wie a und zeigt die höchste Priorität Modul mid für jedes Projekt 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 

Dann brauchen Sie eine große JOIN alles zusammen zu ziehen. Im Überblick sieht es so aus.

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 

Die eigentliche Abfrage wie folgt aussieht, mit den setzen Subqueries. (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 

Das Geheimnis um dies zu verstehen, dass Unterabfragen sind virtuelle Tabellen, die Sie miteinander verbinden können oder zu gewöhnlichen Tischen. Die Fähigkeit, die Sie benötigen, ist das Aussortieren der Kombination von physischen und virtuellen Tabellen, die Sie benötigen, und der Join-Sequenz.

+0

Oh, es tut mir leid. Ich habe etwas in deiner Frage vermisst. Sie müssen 'MIN (Priorität)' verwenden, wobei ich 'MAX (Priorität)' –

+0

Hi @O verwendet habe.Jones, ich bin wirklich dankbar für deine Hilfe! Ich hatte Probleme, wenn ich mich den Ergebnissen von Modulen und Aufgaben anschloss, aber das sieht wirklich gut aus. Dies war ein vereinfachtes Schema, also werde ich es versuchen und zurückkommen. –

+0

Ich habe 7 Tabellen für das Ergebnis beizutreten, also werde ich es später versuchen, aber ich kann in sqlfiddle sehen, das funktioniert so, wie ich es erwartet hatte. So eine gute Antwort mit Erklärung. Danke vielmals! +1 und akzeptiert. –

Verwandte Themen