2011-07-19 131 views
1

我有一個相當長的查詢,導致我一些問題。對於第一個子查詢,我不斷收到錯誤:「MySQL服務器版本的附近使用了正確的語法'第5行SELECT project.project_total_num_hours_quoted FROM項目內部連接time_recor'」。MySQL的子查詢總和

子查詢的問題是:

sum(SELECT 
    project.project_total_num_hours_quoted 
    FROM 
    project inner join time_recording using(project_id) 
    WHERE 
    project.company_id = company.company_id 
    AND project_is_retainer != 1 
    AND time_recording.time_recording_event_start_datetime >= '2011-01-01' AND time_recording.time_recording_event_stop_datetime <= '2011-03-01' 
    group by project_id 
    ) AS hours_quoted, 

這返回的結果集。在較大的查詢中,我只是想得到總和。

SELECT 
SUM((unix_timestamp(time_recording.time_recording_event_stop_datetime)-unix_timestamp(time_recording.time_recording_event_start_datetime))/3600) AS total_time, 
company.company_label, 

sum(SELECT 
project.project_total_num_hours_quoted 
FROM 
project inner join time_recording using(project_id) 
WHERE 
project.company_id = company.company_id 
AND project_is_retainer != 1 
AND time_recording.time_recording_event_start_datetime >= '2011-01-01' AND time_recording.time_recording_event_stop_datetime <= '2011-03-01' 
group by project_id 
) AS hours_quoted, 

(SELECT SUM(project.project_total_num_hours_quoted) 
FROM project 
INNER JOIN time_recording ON project.project_id = time_recording.project_id 
WHERE time_recording.time_recording_event_start_datetime>='2011-01-01' 
AND project_is_retainer!=1 
AND time_recording.time_recording_event_stop_datetime<='2011-03-01' 
AND project.company_id!=1 
) AS total_hours_quoted, 

(
SELECT 
SUM((unix_timestamp(time_recording.time_recording_event_stop_datetime)-unix_timestamp(time_recording.time_recording_event_start_datetime))/3600) 
FROM time_recording 
INNER JOIN project ON time_recording.project_id = project.project_id 
WHERE project.company_id!=1 
AND project_is_retainer!=1 
AND time_recording.time_recording_event_start_datetime>='2011-01-01' 
AND time_recording.time_recording_event_stop_datetime<='2011-03-01' 
) 
AS total_hours 

FROM time_recording 
INNER JOIN project ON time_recording.project_id = project.project_id 
INNER JOIN company ON project.company_id = company.company_id 
WHERE company.company_id!=1 
AND project_is_retainer!=1 
AND time_recording.time_recording_event_start_datetime>='2011-01-01' 
AND time_recording.time_recording_event_stop_datetime<='2011-03-01' 
GROUP BY company.company_id 
ORDER BY total_time desc 
LIMIT 7 

回答

1

在您的第一個子查詢中,如果在外部查詢中求和它,則不需要該組。並且您錯過了ON條款。

SELECT project.project_total_num_hours_quoted 
FROM project inner join time_recording 
ON project.id=time_recording.project_id 
WHERE 
project.company_id = company.company_id 
AND project_is_retainer != 1 
AND time_recording.time_recording_event_start_datetime >= '2011-01-01' 
AND time_recording.time_recording_event_stop_datetime <= '2011-03-01' 
1

我強烈建議報廢並重新開始。

幾個(如果不是全部的話)子查詢可以合併成一個SELECT語句。外部SELECT是一個聚合操作,它選擇未包含在GROUP BY子句中的非聚合值。 MySQL不會優化推謂。並且在查詢中有冗餘連接。