2013-04-23 99 views
8

:) 我有2個查詢,我需要加入他們,我需要比較根據活動的員工的工作時間與公司在定義的時間段內在同一活動中的總工作時間MYSQL左加入GROUP BY

第一個查詢:

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 

我的第二個查詢是:

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 

第一個查詢返回我的activites分組工人總工作時間,例如:

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

第二個查詢返回我公司通過activites分組的總工作時間,例如:

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

我想有這樣的事情,所以我可以比較的總時間每項活動的工作者公司特定時期工作多少小時活動的總時間:

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

在NULL值的情況下,我想使用LEFT JOIN。我正在尋找3個小時的解決方案,而我嘗試的所有東西都無法正常工作,所以我們將不勝感激。

+0

請 – 2013-04-23 08:52:57

回答

8

您只需加入2個查詢一起作爲一對子查詢的。

喜歡的東西: -

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 

但是真的不能給你更多你似乎第一個示例查詢不帶回你說的細節(只帶回3列)。

編輯 - 與該修正的查詢

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

我剛剛編輯它:)忘了添加一個屬性 – enigmaticus 2013-04-23 08:15:37

+1

正是我需要的,很棒:) thanx很多! :) – enigmaticus 2013-04-23 08:53:09

3

最簡單的就是使用子查詢(儘管它們通常不是太高效,但那些GROUP BY可能會使其他解決方案變得困難)。

像這樣的東西應該這樣做:

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

剛剛編輯一些示例數據發佈您的模式:)感謝您的幫助,我是想,你在這裏所做的這一切與類似的東西的時候,但它沒有工作:(所以非常感謝!:) – enigmaticus 2013-04-23 08:20:00