Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL总和不正确,请连接_Mysql_Sql_Aggregate Functions - Fatal编程技术网

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没有这个要求。重新阅读后,它可能不会影响您的输出,但也不是必需的。