使用union和group by的性能问题和sql查询的优化

时间:2015-07-23 14:14:13

标签: mysql performance group-by union

我有一个用户列表,我希望按特定条件进行分组。简化后,它们按A,B,C,D,E分组 E列可以在此列表中选择一个值:000,071,072,2C,2D,2M,3M,3D。
您不能重新组合具有不同E值的用户,除了可以组合在一起的000,072和071(因此E不在这些用户的group by子句中)。
为此,我做了第一个看起来像这样的联盟(真正的查询包含几个JOIN,而不仅仅是"用户",但它只会增加复杂性,对我的问题毫无用处):

Select A, B, C, D, E from users where E not in ('071','072','000') group by A,B,C,D,E
union
select A, B, C, D, group_concat(E) from users where E in ('071','072','000') group by A,B,C,D

直到现在它完成了工作。最近我们不得不添加一个新专栏。此列表示用户如何添加到我们的数据库中。以前,它总是自动完成。现在它可以手动完成,但通过这样做,一些列留空,E是其中之一,因为E来自我们不填写手动方法的表。这些用户必须重新加入',' 071'和' 072' (因为E为Null时的默认值为' 000')。

所以我想象了这样的事情:

Select A, B, C, D, E from users where E not in ('071','072','000') group by A,B,C,D,E
union
select A, B, C, D, group_concat(E) as E from 
    (select A,B,C,D, '000' as E  from manual_users
     union
     select A, B, C, D, group_concat(E) as E from automatic users 
     where E in ('071','072','000')
) as 000
group by A,B,C,D

你认为这是一种让它更简单的方法吗?使用我的实际数据库,此查询长达150行,我确信我可以通过其他方式执行此操作

0 个答案:

没有答案