2013-04-23 15 views
8

:) Ho 2 query, e ho bisogno di unirmi a loro, ho bisogno di confrontare il tempo di lavoro dei dipendenti in base all'attività con il tempo di lavoro totale della società nella stessa attività nel periodo definitoMYSQL LEFT JOIN con GROUP BY

prima interrogazione è:

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 

E la mia seconda domanda è:

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 prima query mi restituisce tempo di lavoro totale di OPERAIO raggruppati per attività, per esempio:

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

La seconda query mi restituisce tempo di lavoro totale di COMPANY raggruppati per attività, ad esempio:

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

voglio avere qualcosa di simile, in modo da poter confrontare il tempo totale di operaio per attività con il tempo totale di società di ore di lavoro per attività nel periodo specifico:

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

in caso di valori NULL vorrei usare LEFT JOIN. Stavo cercando la soluzione per 3 ore, e tutto quello che provo non funziona, quindi qualsiasi aiuto sarebbe apprezzato.

+0

si prega di inviare il vostro schema con alcuni dati di esempio –

risposta

8

Si può solo unire le 2 domande insieme come una coppia di subselect.

Qualcosa di simile: -

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 

Tuttavia non può davvero dare più come si primo esempio di query non sembra riportare i dettagli che dici (porta solo indietro 3 colonne).

EDIT - Con le query corrette

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

L'ho appena modificato :) Ho dimenticato di aggiungere un altro attributo – enigmaticus

+1

proprio quello di cui avevo bisogno, ottimo :) Grazie mille! :) – enigmaticus

3

Il modo più semplice sarebbe utilizzare le sottoquery (sebbene in generale non siano troppo efficienti, ma quelle GROUP BY potrebbero rendere difficili altre soluzioni).

Qualcosa di simile dovrebbe farlo:

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 ?? */ 
+0

appena modificato :) grazie per aiuto, ho cercato tutto il tempo con qualcosa di simile, come hai fatto qui , ma non ha funzionato :(quindi grazie mille! :) – enigmaticus