web-dev-qa-db-fra.com

MYSQL LEFT JOIN avec GROUP BY

:) J'ai 2 requêtes, et je dois les rejoindre, je dois comparer le temps de travail de l'employé en fonction de l'activité avec le temps de travail total de l'entreprise dans la même activité pendant une période définie

La première requête est:

SELECT u.login,
       a.article, 
       p.p_article, 
       (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime
FROM pos p,users u, articles a
WHERE u.login = p.p_login
AND REPLACE( u.login, '.', '_' ) = 'users_name'
AND p.p_datum >= '2013-04-09'
AND p.p_datum <= '2013-04-16'
AND p.p_article = a.id
GROUP BY a.article

Et ma deuxième requête est:

SELECT a.article, 
       p.p_article, 
       (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime
FROM pos p, articles a
WHERE p.p_datum >= '2013-04-09'
AND p.p_datum <= '2013-04-16'
AND p.p_article = a.id
GROUP BY a.article

La première requête me renvoie le temps de travail total de WORKER groupé par activités, par exemple:

u.login    a.article     p.p_article  tottime
Ivan       Teambuilding    1          3,45
Julie      Social_work     2          5,67

La deuxième requête me renvoie le temps de travail total de la SOCIÉTÉ regroupé par activités, par exemple:

a.article     p.p_article  tottime
Teambuilding    1         150
Social_work     2         260

Je veux avoir quelque chose comme ça, donc je peux comparer le temps total du travailleur par activité avec le temps total des heures de travail de l'entreprise par activité dans une période spécifique:

u.login    a.article     p.p_article  tottime(worker)  tottime(company) 
Ivan       Teambuilding    1          3,45              150  
Julie      Social_work     2          5,67              260

Dans le cas des valeurs NULL, je voudrais utiliser LEFT JOIN. Je cherchais la solution depuis 3 heures, et tout ce que j'essaye ne fonctionne pas, donc toute aide serait appréciée.

12
enigmaticus

Vous pouvez simplement joindre les 2 requêtes en tant que paire de sous-sélections.

Quelque chose comme:-

SELECT Sub1.a, Sub1.b, Sub2.c
FROM (SELECT a, b FROM z) Sub1
INNER JOIN (SELECT a, c FROM y) Sub2
ON Sub1.a = Sub2.a

Cependant, je ne peux pas vraiment vous donner plus car votre premier exemple de requête ne semble pas ramener les détails que vous dites (ne ramène que 3 colonnes).

EDIT - Avec les requêtes corrigées

SELECT Sub1.login AS User_name, Sub1.article AS Activity, Sub1.p_article AS `Activity id`, Sub1.tottime AS `Totaltime(worker)`, Sub2.tottime AS `Totaltime(company)`
FROM (SELECT u.login,a.article, p.p_article, (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime
FROM pos p
INNER JOIN users u ON u.login = p.p_login 
INNER JOIN articles a ON p.p_article = a.id
WHERE REPLACE( u.login, '.', '_' ) = 'users_name'
AND p.p_datum >= '2013-04-09'
AND p.p_datum <= '2013-04-16'
GROUP BY a.article) Sub1
INNER JOIN 
(SELECT a.article, p.p_article, (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime
FROM pos p
INNER JOIN articles a ON p.p_article = a.id
WHERE p.p_datum >= '2013-04-09'
AND p.p_datum <= '2013-04-16'
GROUP BY a.article) Sub2
ON Sub1.p_article = Sub2.p_article
10
Kickstart

Le plus simple serait d'utiliser des sous-requêtes (bien qu'elles ne soient généralement pas trop efficaces, mais celles GROUP BY peut rendre d'autres solutions difficiles).

Quelque chose comme ça devrait le faire:

SELECT a.*, b.tottime AS 'Total time (company)'
FROM
    (SELECT u.login, a.article, p.p_article, (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS 'Total time (worker)'
    FROM pos p, users u, articles a
    WHERE u.login = p.p_login
    AND REPLACE( u.login, '.', '_' ) = 'users_name'
    AND p.p_datum >= '2013-04-09'
    AND p.p_datum <= '2013-04-16'
    AND p.p_article = a.id
    GROUP BY a.article) a
LEFT JOIN
    (SELECT a.article, p.p_article, (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime
    FROM pos p, articles a
    WHERE p.p_datum >= '2013-04-09'
    AND p.p_datum <= '2013-04-16'
    AND p.p_article = a.id
    GROUP BY a.article) b
ON a.article = b.article /* AND a.p_article = b.p_article ?? */
4
Dukeling