0

そのテーブルのすべての行に値が見つからない場合でも、 client.client_name のすべての値が結果に出力されるように要求することで、強化したい MySQL クエリがあります。現在の表は次のとおりです。

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 に答える