MySQL总和不正确,请连接
我正在构建一个假期系统,其中一个功能是能够购买额外的假期,你可以在一年中的几个时间点购买,所以我想看看假期的总天数,每个用户预订了多少,购买了多少 我在做一个查询MySQL总和不正确,请连接,mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,我正在构建一个假期系统,其中一个功能是能够购买额外的假期,你可以在一年中的几个时间点购买,所以我想看看假期的总天数,每个用户预订了多少,购买了多少 我在做一个查询 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 j
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
现在,这将使DaysBuw列Waaay中的结果比我预期的要高,这是很奇怪的,因为当我去掉总和,只进行hr_buyback.days时,它显示了我预期的所有单个值(除非我更希望它们是总和)
其次,在MySQL中,您可以做MSSQL中可以做的事情吗
left outer join hr_buyback on (select hr_buyback.user_id where buy_sell = 'buy') = hr_leave.user_id
?
相关表格定义(我想这就是你的意思?)
人力资源回购
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
人力资源用户
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
休假
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
问题可能是,对于
hr\u leave
中的每个匹配行,您将从hr\u回购
中获得一份每行的副本
我假设每个用户可能有多个hr\u回购
行,并且可能有hr\u回购
行而没有hr\u休假
行。如果是这样,您可能会想要这样的东西:
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
能否包含表定义?第二个代码段缺少一个
FROM
子句。我会用不同的格式写,但是,是的-MySQL支持内联视图/派生表。当您返回大量记录时,如果您期望的是一个较小的数字,则通常表示笛卡尔连接,并表示您没有正确连接表。@sam.clements-您的分组依据
可以掩盖不正确的连接,从而导致较高的和
值我已经有一段时间没有使用MSSQL了,但是MySQL没有这个要求。重新阅读后,它可能不会影响您的输出,但也不是必需的。