2016-08-01 20 views
1

Ich habe zwei Tabellen, und ich möchte die Summe der protokollierten Minuten für die Aufgaben nach Tag gruppiert, die meiste Zeit die Teilaufgaben haben das gleiche Tag wie die Eltern aber in einigen Fällen nicht.Wenn Tag aus Subtask leer, erben Tag von übergeordneten Task

Wie kann ich die Summe der protokollierten Minuten nach Tag gruppieren, einschließlich der Unteraufgaben, wenn sie also kein Tag haben, erben sie das Tag von ihrem Elternteil.

Aufgabe

+-----+-----------+------+-------+------------+ 
| id | parent-id | name | tag | is-subtask | 
+-----+-----------+------+-------+------------+ 
| 001 |   | a | sales |   0 | 
| 002 |  001 | b | sales |   1 | 
| 003 |  001 | c |  |   1 | 
| 004 |   | d | store |   0 | 
+-----+-----------+------+-------+------------+ 

mal

+-----+---------+-------------+----------------+ 
| id | task-id | description | logged-minutes | 
+-----+---------+-------------+----------------+ 
| 991 |  001 | Time for a |    15 | 
| 992 |  002 | Time for ab |    60 | 
| 993 |  002 | Time for ab |    75 | 
| 994 |  003 | Time for ac |    35 | 
| 995 |  004 | Time for d |    20 | 
+-----+---------+-------------+----------------+ 

Antwort

0

Grundsätzlich müssen Sie COALESCE() Funktion verwenden, die in der Liste gefunden ersten Nicht-Null-Wert zurückgibt (wenn es nur Nullwerte sind, es wird zu null) ausgewertet.

Nachdem Sie die Informationen über die Tags aus der abgeleiteten Tabelle (innerer Teil der Abfrage) erhalten haben, können Sie diese Informationen an die Tabelle times anhängen, um eine Summe für jedes Tag zu berechnen.

Ich habe den Code nicht getestet, aber ich glaube, es sollte funktionieren - das geht davon aus, dass Ihre Beziehung nur 1 Ebene tief ist. Wenn Sie eine tiefere Hierarchie haben, überprüfen Sie How to create a MySQL hierarchical recursive query für einige Verbesserungen an diesem Code.

SELECT 
    alltasks.tag 
    , SUM(times.logged-minutes) AS logged-minutes 
FROM (
    -- take parent tasks 
    SELECT 
     tparent.id 
     , tparent.tag 
    FROM task tparent 
    UNION 
    -- take child tasks 
    SELECT 
     tchild.id 
     , COALESCE(tchild.tag, tparent.tag) -- if no child tag, use parent tag 
    FROM task tparent 
    INNER JOIN task tchild ON 
     tparent.id = tchild.parent-id 
     AND tchild.is-subtask = 1 -- may not be necessary unless you have different relationships 
    ) alltasks 
LEFT JOIN times ON 
    alltasks.id = times.task-id 
GROUP BY alltasks.tag