Mysql 如何使用where限制选择,而不删除联接中满足条件的所有条目?

Mysql 如何使用where限制选择,而不删除联接中满足条件的所有条目?,mysql,sql,join,group-by,Mysql,Sql,Join,Group By,我们根据估计完成的工作除以支付的小时数计算奖金。在我们的系统中有一个人不是我们支付的,我想把他从报告中删除 在这个查询中,我得到该用户在每个批次上的所有跟踪时间除以该批次上跟踪的总时间,再减去[name] 批处理具有包含估计的\u非重复和估计的\u重复的任务。 批处理有批处理日志,其中记录了批处理实际处理的时间 所发生的不是选择所有批次,然后获取该用户跟踪的所有时间(与[name]未跟踪的总时间相比),而是忽略其中包含[name]项的每个批次 这是我关于比率的select语句 SELECT us

我们根据估计完成的工作除以支付的小时数计算奖金。在我们的系统中有一个人不是我们支付的,我想把他从报告中删除

在这个查询中,我得到该用户在每个批次上的所有跟踪时间除以该批次上跟踪的总时间,再减去[name]

批处理具有包含估计的\u非重复和估计的\u重复的任务。 批处理有批处理日志,其中记录了批处理实际处理的时间

所发生的不是选择所有批次,然后获取该用户跟踪的所有时间(与[name]未跟踪的总时间相比),而是忽略其中包含[name]项的每个批次

这是我关于比率的select语句

SELECT user_time_by_batch.batch_id, userid, user_time_by_batch / total_time_by_batch as ratio FROM 
( 
SELECT SUM(time_elapsed) user_time_by_batch, userid, batch_id 
FROM batch_log 
inner join batches on batch_log.batch_id = batches.id 
Where start_time between (?) and (?) 
   and end_time is not null and time_elapsed BETWEEN \"00:00:00\" AND \"10:00:00\" 
   and batch_id not in (\"-1\", \"-2\", \"-3\", \"-4\", \"-5\", \"-6\", \"-7\", \"-8\", \"-9\", \"-10\", \"-11\", \"-12\", \"-13\", \"-14\", \"-15\", \"-16\", \"-17\") 
   and batches.operation_id = ? 
   and batch_log.userid = ? 
GROUP BY batch_id, userid 
)  user_time_by_batch 
INNER JOIN 
( 
SELECT SUM(time_elapsed) total_time_by_batch, batch_id 
FROM batch_log 
inner join batches on batch_log.batch_id = batches.id 
Where start_time between (?) and (?)  
  and end_time is not null and time_elapsed BETWEEN \"00:00:00\" AND \"10:00:00\" 
  and batch_id not in (\"-1\", \"-2\", \"-3\", \"-4\", \"-5\", \"-6\", \"-7\", \"-8\", \"-9\", \"-10\", \"-11\", \"-12\", \"-13\", \"-14\", \"-15\", \"-16\", \"-17\") 
  and batches.operation_id = ? 
  and batch_log.userid != 'name' 
GROUP BY batch_id 
) total_time_by_batch 
ON user_time_by_batch.batch_id = total_time_by_batch.batch_id ;

我想尝试的一件事就是移动BATCHYLog.USERID!smapherson'在JOIN语句中,而不是在WHERE子句中。我不确定这是怎样的最佳实践,但我已经通过这种方式成功地消除了奇怪的数据问题

因此:


你说“它忽略了每一批有Smapherson作为条目的产品。”我想这正是你要它做的。我的猜测是,你需要按用户和批次(不仅仅是批次)对时间进行求和,不包括麦克弗森,然后按批次对时间进行求和,得到批次总数。是的,我只是想把他从批次中剔除:如果bob工作6小时,mac工作3小时,那么bob的比率应该是1.0,而不是6.66666。我不确定,但我认为你现在所做的是说“总结一下,但不要选择mac的任何批次”。我认为您要做的是将所有非mac用户相加,然后将他们的时间相加,以创建批总数进行比较。那么鲍勃是1.0。但我可能有点离谱。我希望能够将每个人的总数与批次中的所有人进行比较,就好像mac不存在一样。所以,基本上,忽略mac所在的每一批日志,但不是每一批。我们将尝试此方法。看起来这可能是我需要的。我想提出这个建议,但我不知道它是否有效。我没有mySQL和Access在测试加入时抛出,我就是这样做的。有兴趣看看你是否成功。嗯。。我不明白加入一个精选的团队。这对你来说是有效的,还是你仍然有问题?
INNER JOIN 
( 
SELECT SUM(time_elapsed) total_time_by_batch, batch_id 
FROM batch_log 
inner join batches on batch_log.batch_id = batches.id and batch_log.userid != 'smacpherson'
Where start_time between (?) and (?)  
  and end_time is not null and time_elapsed BETWEEN \"00:00:00\" AND \"10:00:00\" 
  and batch_id not in (\"-1\", \"-2\", \"-3\", \"-4\", \"-5\", \"-6\", \"-7\", \"-8\", \"-9\", \"-10\", \"-11\", \"-12\", \"-13\", \"-14\", \"-15\", \"-16\", \"-17\") 
  and batches.operation_id = ?  
GROUP BY batch_id 
) total_time_by_batch