MySQL:使用Case When-Then结束多个内部联接表

MySQL:使用Case When-Then结束多个内部联接表,mysql,Mysql,我有一个查询,它使用“Case When Then End”从三个连接的表返回结果。看起来是这样的: 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

我有一个查询,它使用“Case When Then End”从三个连接的表返回结果。看起来是这样的:

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。这里需要注意的是,对于特定的“文件名”,每个表只有一个条目(行)。 现在,当我尝试添加另一个具有表的内部联接时,每个“文件名”可以有多个条目(行),结果会出错,因为只有最后一个“和”显示正确的值,而其他“和”给出错误的值。第二个查询是:

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

有没有办法为所有列获取正确的数字?

您的一对多联接会导致总行数增加,因此当您的值=1时,您会多次添加该值。为了缓解这一问题,您可能希望改用count函数,使用它来计算不同的用户ID。比如:

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

然后,只对每个用户计数一次,而不是添加每一行

如果
多文件数据
表可以包含
文件
表中任何相应记录的多条记录,则需要在单独的查询中进行聚合,并将其连接回主查询

例如(语法可能不完美;专注于概念):


谢谢,它工作得很好,只是当与一对多计数一起使用时,“distinct”会产生错误的值。删除“distinct”解决了这个问题。另一个问题是:在这种情况下,如何获得每列的总和?当我与roll-up一起使用时,它会给出由“groupby子句”(水平和)生成的组的总和,而我需要每个列的垂直总和。另一个问题:在这种情况下,如何获得每个列的总和?当我与roll-up一起使用时,它给出了由“groupby子句”(水平和)生成的组的总和,而我需要每个列的垂直和。
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;