2013-04-23 19 views
8

:) Mam 2 pytania i muszę do nich dołączyć, muszę porównać czas pracy pracownika w zależności od aktywności z łącznym czasem pracy firmy w tej samej działalności w określonym okresieMYSQL LEFT DOŁĄCZ DO GRUPY PRZEZ

pierwsze zapytanie jest:

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 

I moje drugie zapytanie brzmi:

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 

pierwszy kwerenda zwraca mi całkowitego czasu pracy pracownika pogrupowany według aktywnosci, na przykład:

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

Drugie zapytanie zwraca mi całkowity czas pracy firmy pogrupowane według aktywnosci, na przykład:

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

chcę mieć coś takiego, więc mogę porównać całkowity czas pracownik za działania z łącznym czasem spółki godzin pracy w działalności w danym okresie:

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

w przypadku wartości NULL Chciałbym użyć LEFT JOIN. Szukałem rozwiązania przez 3 godziny, a wszystko, co próbuję, nie działa, więc każda pomoc byłaby doceniana.

+0

proszę wysłać schemat z niektórych przykładowych danych –

Odpowiedz

8

można po prostu dołączyć do 2 zapytań razem jako para obsługę żądań.

Coś jak: -

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 

Jednak nie mogę dać ci więcej, jak pierwszy przykład kwerenda nie wydaje się, aby przywrócić dane mówisz (przynosi tylko z powrotem 3 kolumny).

EDIT - Z skorygowanych zapytaniami

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

Właśnie je edytowałem :) zapomniałem dodać jeszcze jednego atrybutu – enigmaticus

+1

właśnie tego potrzebowałem, świetnie :) thanx dużo! :) – enigmaticus

3

Najprostszym byłoby użycie pod-zapytań (choć generalnie nie są one zbyt wydajne, ale te GROUP BY mogą utrudnić inne rozwiązania).

Coś jak to powinno wystarczyć:

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

tylko edytowanych :) dziękuję za pomoc, starałem się cały czas z czymś podobnym, jak zrobiłeś to tutaj , ale to nie zadziałało :(dziękuję bardzo! :) – enigmaticus