2012-10-24 37 views
1

我正在建立一個假日系統,其中一個功能是可以購買額外的假期,你可以在一年中的幾個點上做,所以我想看到總數天假期,預訂了多少,每個用戶購買了多少。MySQL總和不正確,並加入

我做一個查詢

SELECT hr_user.name AS username, 
     hr_user.user_id, 
     SUM(working_days) AS daysbooked, 
     sum(hr_buyback.days) AS daysbought 
FROM hr_leave 
inner join hr_user on hr_user.user_id = hr_leave.user_id 
left outer join hr_buyback on hr_buyback.user_id = hr_user.user_id 
where active = 'y' 
    and hr_leave.start_date between '2012-01-01' and '2012-12-31' 
    and (hr_leave.status = 'approved' OR hr_leave.status = 'pending') 
GROUP BY hr_user.name, hr_user.user_id 

現在,這是帶回導致daysbought列waaaay比我所期待的更高,這是奇怪的,因爲當我擺脫總和,只是有hr_buyback .days它顯示了所有我期望的(除了我寧願他們總結)的各個值

其次,在MySQL中,你可以做你可以在MSSQL是

left outer join hr_buyback on (select hr_buyback.user_id where buy_sell = 'buy') = hr_leave.user_id 

相關表定義(我認爲這是什麼意思?):

hr_buyback

buyback_id int(11) NO PRI  auto_increment 
user_id  int(11) NO   
days  int(11) NO   
buy_sell varchar(10) NO   
status  varchar(10) NO  pending 
year  int(11) NO  

hr_user

user_id  int(11) NO PRI  auto_increment 
name  varchar(40) NO   
email  varchar(40) NO UNI  
level  int(5) YES   
manager_id int(11) NO   
team_id  int(11) YES   
active  varchar(2) NO  y 
holidays_day int(11) NO   
start_date timestamp NO  CURRENT_TIMESTAMP 
password varchar(60) NO   
division_id int(11) YES   
day_change int(5) NO  0 
priv_hours varchar(2) NO  n 
po_level int(2) YES  0 
po_signoff int(10) YES 

hr_leave

leave_id int(11) NO PRI  auto_increment 
user_id  int(11) NO   
start_date date NO   
end_date date NO   
day_type varchar(10) NO   
status  varchar(20) NO  pending 
working_days varchar(5) NO   
leave_type int(11) NO   
cancel  int(11) NO  0 
date  timestamp NO  CURRENT_TIMESTAMP 
+0

你能包括你的表定義嗎? – doublesharp

+0

第二個代碼段缺少一個'FROM'子句。我會以不同的格式寫入,但是 - MySQL支持嵌入式視圖/派生表。 –

+0

@doublesharp added – franglais

回答

2

這個問題可能是您將從hr_buyback獲得hr_leave中每個匹配行的每一行的一個副本。

我假設每個用戶可以有多個hr_buyback行,並且有可能有沒有hr_leave行的hr_buyback行。如果是這樣,你可能會想要這樣的事情:

SELECT hr_user.name AS username, 
    hr_user.user_id, 
    SUM(working_days) AS daysbooked, 
     (SELECT SUM(days) 
     FROM hr_buyback 
     WHERE hr_buyback.user_id = hr_user.user_id) AS daysbought 
FROM hr_user 
left join hr_leave on hr_user.user_id = hr_leave.user_id 
where active = 'y' 
and hr_leave.start_date between '2012-01-01' and '2012-12-31' 
and (hr_leave.status = 'approved' OR hr_leave.status = 'pending') 
GROUP BY hr_user.name, hr_user.user_id