如何加入两个SELECT语句?

时间:2017-06-30 10:11:41

标签: mysql sql

我想加入以下两个查询。但是第二个查询的条件不应该影响第一个查询的结果。我可以这样做吗?

查询1

SELECT ed.name, COUNT(ej.designation) AS actual
FROM emp_designations ed 
JOIN emp_job_details ej on ed.id = ej.designation 
WHERE ed.department = 4 
GROUP BY ej.designation,ed.name

查询2

SELECT ej.designation, COUNT(*) as present 
FROM daily_attendances da 
JOIN emp_job_details ej ON da.emp_id = ej.emp_id
WHERE da.in_time != '' AND da.date = '2017-06-02' 
GROUP BY ej.designation

查询1的结果 enter image description here

查询2的结果 enter image description here

在查询2的指定栏中,12,13,14等于Cutting Incharge,patern maker,Supervisor。

我想加入这两个表

3 个答案:

答案 0 :(得分:2)

你可以尝试

SELECT ej.designation, ed.name, COUNT(ej.designation) AS actual, COUNT(da.emp_id) as present
FROM emp_designations ed 
JOIN emp_job_details ej on ed.id = ej.designation 
LEFT JOIN daily_attendances da 
    ON (da.emp_id = ej.emp_id AND da.in_time != '' AND da.date = '2017-06-02')
WHERE ed.department = 4 
GROUP BY ej.designation ,ed.name

答案 1 :(得分:1)

据我所知,第一个auery列出了名称和指定计数。 第二个查询是计算每个指定的所有出勤率。

如果您想JOIN这两个查询,那么您的链接就是designation。 我使用了SUM& COALSESCE,因为最终结果集将再次按指定分组 - 所以我必须使用聚合函数超过当前计数。 COALESCE将返回0而不是NULLS。以防结果集之间没有匹配。

这就是你要找的地方吗?如果没有,只需添加评论。

    SELECT ed.name
          ,COUNT(ej.designation) AS actual
          ,SUM(COALESCE(pres.present,0)) AS present
      FROM emp_designations ed 
INNER JOIN emp_job_details ej 
        ON ed.id = ej.designation 
LEFT OUTER JOIN 
        (
          SELECT ej.designation
               ,COUNT(*) as present 
            FROM daily_attendances da 
      INNER JOIN emp_job_details ej 
              ON da.emp_id = ej.emp_id
           WHERE da.in_time != '' 
             AND da.date = '2017-06-02' 
        GROUP BY ej.designation
        ) pres
       ON pres.designation = ej.designation     
     WHERE ed.department = 4 
  GROUP BY ej.designation
          ,ed.name

答案 2 :(得分:0)

如果要消除任何重复的记录,可以使用UNION。如果重复项不重要,请尝试UNION ALL,这将帮助您解决问题。

在以下位置阅读有关这些命令: https://dev.mysql.com/doc/refman/5.7/en/union.html