Doppelt verschachtelter Subquery

Basementmedia

Grünschnabel
Hallo zusammen,

ich hab ein kleines MYSQL-Problemchen und hoffe, dass mir hier jemand etwas Unterstützung geben kann.
Einen Mysql-Forumsbereich hab ich hier leider nicht gefunden, daher hab ich das PHP-Forum verwendet:

Ich hab den folgenden Query, der mir aus einer Datenbank-Tabelle namens "stunden" (Mysql) gruppiert nach Projekt die Summe der Stunden ausgibt, die der User mit der ID 27 innerhalb eines Zeitraums gebucht hat.

SQL:
SELECT sum(stunden.stunden)
FROM stunden
LEFT JOIN projekte ON stunden.projekt_id = projekte.ID
WHERE stunden.user_id = [B]27[/B] AND (stunden.datum between '2018-01-01' AND '2018-01-31')
GROUP BY stunden.projekt_id

Dieser Query erzeugt nun ca. 20 Einzelergebnisse, also die Stundensummen pro Projekt.

Im ersten Schritt möchte ich nun den Query so erweiteren, dass er mir die Summe aus den einzelnen Ergebnissen ausgibt. Auch das klappt noch wunderbar (die geänderten Teile hab ich fett markiert):

SQL:
SELECT SUM(stunden) as summe_stunden FROM (
SELECT sum(stunden.stunden) as stunden
FROM stunden
LEFT JOIN projekte ON stunden.projekt_id = projekte.ID
WHERE stunden.user_id = 27 AND (stunden.datum between '2018-01-01' AND '2018-01-31')
GROUP BY stunden.projekt_id
)x

Nun kommt mein eigentliches Problem. Bisher ist die ID des Users ja noch fix auf 27 gesetzt.
Ich möchte den oben aufgeführten Query nun aber in einen Hauptquery integrieren, der für alle User der Tabelle "user" diesen Subquery durchführt (und der auch noch andere Teilberechungen macht, die nicht Gegennstand der Frage sind).

Dieser sieht erstmal folgendermaßen aus:

SQL:
SELECT
u.ID as dataset_id,
u.name
FROM user u ORDER BY u.name

Ich hab nun versucht, den Subquery folgendermaßen zu integrieren (ale neuen Teile sind grün):

SQL:
SELECT
u.ID as dataset_id,
u.name,
SELECT SUM(stunden) as summe_stunden FROM (
SELECT sum(stunden.stunden) as stunden
FROM stunden
LEFT JOIN projekte ON stunden.projekt_id = projekte.ID
WHERE stunden.user_id = u.ID AND (stunden.datum between '2018-01-01' AND '2018-01-31')
GROUP BY stunden.projekt_id
)x
FROM user u ORDER BY u.name

Und das funktioniert nun leider nicht mehr, weil u.ID zu tief verschachtelt ist.
Mir fällt aber kein Weg ein, diese Umschachtelung zu umgehen.

Puh, sorry, wegen dem vielen Text aber ich hoffe es ist halbwegs verständlich.
Hat jemand einen Tip, wie man z.B. die erste Umschachtelung umgeht, damit ich dann beim integrieren des Subqueries in den Hauptquery nur eine Verschachtelung hab? Denn dann würde es gehen.

Viele Grüße
Daniel
 
Zuletzt bearbeitet von einem Moderator:
Hallo
das Forum hat dir nicht gefallen :D Nutze bitte das nächste mal die Code-Tags. Du willst also die Gesamtstunden pro USer und Projekt?

SQL:
SELECT
    u.*
     ,projekt_stunden.Stunden
FROM
    user u
LEFT JOIN
    (
        SELECT
            s.user_id,
            s.projekt_id,
            SUM(s.stunden) Stunden
        FROM
            stunden s
        LEFT JOIN
            projekte p
            ON s.projekt_id = p.id
        WHERE 
            s.datum between '2018-01-01' AND '2018-01-31'
         GROUP BY 
             s.user_id, 
             ,s.projekt_id
    ) projekt_stunden
    ON projekt_stunden.user_id = user.id
 
Zurück