2013-05-01 16 views
0

列我不知道這是可能的,甚至聰明的,但這裏有雲:檢索行,他們的總和小於在連接表

我有2個表,一個是一個時間表表和一個是authorized_services。下面是每個基本表結構:

TIMESHEETS       AUTHORIZED_SERVICES 
timesheet_id      authorized_service_id 
time_in (unix timestamp)   valid_from (unix timestamp) 
time_out (unix timestamp)   valid_until (unix_timestamp) 
service_id (int)     service_id (int) 
service_date (unix timestamp)  number_of_units (int) 

我需要的是查詢時間表表檢索指定日期範圍,其中TIME_OUT的總和之間的所有結果 - time_in/60/60 < = number_of_units。這是查詢我想出來的,它返回基於的service_id和時間範圍相匹配的授權服務,所有的時間表項:

SELECT 
((a.time_out - a.time_in)/60/60) as total_time, 
a.service_id, 
b.number_of_units, 
FROM 
timesheets a 
LEFT JOIN authorization_services b 
ON a.service_id = b.service_id 
WHERE 
a.time_in >= UNIX_TIMESTAMP("2013-03-25") AND a.time_out <= UNIX_TIMESTAMP("2013-04-30") 
AND a.service_date BETWEEN b.valid_from AND b.valid_until 
GROUP BY a.timesheet_id; 

不過,我希望能夠只返回時間表條目,其中結果集中total_time的總數小於number_of_units。這可能嗎?

編輯澄清: 我會在PHP中做這個循環遍歷返回的結果,並將每行的total_time累加到cumulative_total_time。當cumulative_total_time等於或小於number_of_units時,我會跳出循環。不要確定如何,或者如果這在MySQL中是可能的。

回答

1

我想你需要的是

GROUP BY b.service_id
HAVING SUM((a.time_out - a.time_in)/60/60) <= b.number_of_units 不是嗎?

+0

hHi Lucia - 感謝您的迴應,但只獲得的總時間少於每行的number_of_units,而不是獲取所有行的累計時間。 – 2013-05-01 22:13:14

+0

據我所知,那麼你需要的是一個'GROUP BY b.service_id',對吧?有了這個,你將能夠通過service_id獲得累計和。我不確定這是否是您需要的。 – 2013-05-01 22:18:21

+0

這就是我的想法,但我錯過了每個單獨的時間表行。我不認爲這是可能的。感謝您的想法和幫助! – 2013-05-02 09:06:08