0

我有一个 MySQL 查询,我想通过要求在结果中打印出 client.client_name 的所有值来增强它,即使该表中的每一行都没有找到值。当前表格显示:

client.client_name
Client A
Client B
Client C

当前的 MySQL 查询如下:

    SELECT X.expr1 AS 'Project Name', SUM(X.expr2) AS 'Total Hours Logged', X.expr3 - sum(X.expr2) AS 'Monthly Hours Remaining', X.expr4 AS 'Last Day', DATEDIFF(X.expr4 , curdate()) AS 'Days Remaining'
FROM 
(SELECT 
    client.client_name AS expr1
    , sum(time_records.value) AS expr2
    , client.monthly_hours AS expr3
FROM project_objects
  INNER JOIN projects
    ON projects.id = project_objects.project_id
  INNER JOIN time_records
    ON time_records.parent_id = project_objects.id
  LEFT JOIN client  
  ON project_objects.project_id = client.project_id 
  WHERE time_records.parent_type = 'Task' 
  AND client.start_day_of_month < dayofmonth(curdate())
  AND time_records.state = 3
  GROUP BY client.client_name

  UNION

  SELECT 
    client.client_name AS expr1
    , sum(time_records.value) as expr2
    , client.monthly_hours AS expr3
  FROM projects
  INNER JOIN time_records
    ON projects.id = time_records.parent_id
  LEFT JOIN client  
   ON projects.id = client.project_id 
  WHERE time_records.parent_type = 'Project'
  AND client.start_day_of_month < dayofmonth(curdate())
  AND time_records.state = 3
  GROUP BY client.client_name
) X
GROUP BY X.expr1
ORDER BY DATEDIFF(X.expr4 , curdate()

正如您从上面的查询中看到的那样——我为客户端表添加了一个左连接,但是它不会导致打印出所有客户端记录——它只打印那些有 time_records 可用的记录。我认为这与嵌套或我编写连接的顺序有关,但似乎无法弄清楚。如果您有任何想法,将不胜感激。谢谢!

4

1 回答 1

2

请尝试如下顺序:

FROM client LEFT JOIN project_objects 
    ON project_objects.project_id = client.project_id 

在此处查看最终解决方案的 SQLFiddle:http ://sqlfiddle.com/#!2/30362/16

于 2012-10-22T01:33:01.327 回答