2012-04-23 32 views
2

我有一个查询,它使用'Case When Then End'从三个被联结的表中返回结果。它看起来像这样:MySQL:使用大小写然后结束多个内部联接表

select f.filename, 
sum(case when v.rUser like '%bike%' then 1 else 0 end) as bikeUser, 
sum(case when v.rUser like '%Pedestrian%' then 1 else 0 end) as pedestrianUser, 
sum(case when d.weather like '%clear%' then 1 else 0 end) as clearWeather 
from VMdata v 
inner join files f on v.id = f.id 
inner join DMdata d on f.id = d.id 
where f.filename in (X,Y,Z) 
group by f.filename 

这工作正常,每个结果行给出正确的1或0。这里需要注意的是每个表只有一个条目(行)用于特定的“文件名”。 现在,当我尝试添加另一个Inner Join并且每个“文件名”可能有多个条目(行)的表时,结果会变得错误,只有最后一个“总和”显示正确的值,而其他“总和”给出错误的价值。第二个查询是:

select f.filename, 
sum(case when v.rUser like '%bike%' then 1 else 0 end) as bikeUser, 
sum(case when v.rUser like '%Pedestrian%' then 1 else 0 end) as pedestrianUser, 
sum(case when d.weather like '%clear%' then 1 else 0 end) as clearWeather, 
sum(case when m.extras like '%hat%' then 1 else 0 end) as hatExtras 
from VMdata v 
inner join files f on v.id = f.id 
inner join DMdata d on f.id = d.id 
inner join MultiFiledata m on f.id = m.id 
where f.filename in (X,Y,Z) 
group by f.filename 

任何想法获得所有列的正确数字?

回答

0

您的一对多连接导致整体行数增加,因此当您的值= 1时,您将多次添加该值。为了缓解这种情况,您可能需要使用count函数来计算不同的用户ID。例如:

Count(distinct case when [logic goes here] then [user ID] else null end) as bikeuser 

然后,您只计算每个用户一次而不是添加每行。

+0

谢谢,它的工作原理不同之处在于用一个对多数使用时,“独立的”产生错误的值细。删除'独特'解决了这个问题。 – sunsa428 2012-04-24 09:47:46

+0

另一个问题:在这种情况下,如何获得每列的总和?当我使用**卷起来时,它给出了由'group by clause'生成的组的总和(水平和),而我需要每列的垂直和。 – sunsa428 2012-04-26 15:12:21

1

如果MultiFiledata表可以包含files表中任何相应记录的多个记录,那么您需要在单独的查询中执行聚合并将其返回到主查询。

例如(语法可能不是完美的;专心概念):

select f.filename, 
     sum(case when v.rUser like '%bike%' 
        then 1 else 0 end) as bikeUser, 
     sum(case when v.rUser like '%Pedestrian%' 
        then 1 else 0 end) as pedestrianUser, 
     sum(case when d.weather like '%clear%' 
        then 1 else 0 end) as clearWeather 
from  VMdata v 
     inner join files f 
     on v.id = f.id 
     inner join DMdata d 
     on f.id = d.id 
     inner join (
      select id, 
        sum(case when extras like '%hat%' 
          then 1 else 0 end) as hatExtras 
      from MultiFiledata 
     ) m 
     on f.id = m.id 
where f.filename in (X,Y,Z) 
group by f.filename; 
+0

谢谢,我明白了! – sunsa428 2012-04-24 09:48:56

+0

另一个问题:在这种情况下,如何获得每列的总和?当我使用**卷起来时,它给出了由'group by clause'生成的组的总和(水平和),而我需要每列的垂直和。 – sunsa428 2012-04-26 15:11:42