2013-04-23 72 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