Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MYSQL LEFT JOIN with GROUP BY

:) I have 2 queries, and I need to join them, I need to compare the working time of employee depending on activity with total working time of company in the same activity in defined period

First query is:

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

And my second query is:

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

The first query returns me total working time of WORKER grouped by activites, for example:

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

The second query returns me total working time of COMPANY grouped by activites, for example:

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

I want to have something like this, so I can compare the total time of worker per activity with total time of company working hours per activity in specific period:

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 case of the NULL values I would like to use LEFT JOIN. I was searching for the solution for 3 hours, and everything I try is not working, so any help would be appreciated.

like image 986
enigmaticus Avatar asked Apr 23 '13 07:04

enigmaticus


People also ask

Can we use group by in left join?

MySQL LEFT JOIN with Group By ClauseThe Left Join can also be used with the GROUP BY clause. The following statement returns customer id, customer name, qualification, price, and date using the Left Join clause with the GROUP BY clause.

Does MySQL support LEFT join?

The LEFT JOIN keyword returns all records from the left table (table1), and the matching records (if any) from the right table (table2).

What is difference between left join and left outer join in MySQL?

There really is no difference between a LEFT JOIN and a LEFT OUTER JOIN. Both versions of the syntax will produce the exact same result in PL/SQL. Some people do recommend including outer in a LEFT JOIN clause so it's clear that you're creating an outer join, but that's entirely optional.


2 Answers

You can just join the 2 queries together as a pair of subselects.

Something like:-

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

However can't really give you more as you first example query doesn't seem to bring back the details you say (only brings back 3 columns).

EDIT - With the corrected queries

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
like image 67
Kickstart Avatar answered Sep 17 '22 11:09

Kickstart


The simplest would be using sub-queries (though they're in general not too efficient, but those GROUP BY's may make other solutions difficult).

Something like this should do it:

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 ?? */
like image 32
Bernhard Barker Avatar answered Sep 21 '22 11:09

Bernhard Barker