需要解决的问题:假设有表user,查询其中字段user_name和mobile;在数据中mobile有多条重复,当前我们想去重然后取出多条数据,我们需要相同的名字和手机号只作为一条记录显示
常规的方法是以下查询:
Users::find()->select(['user_name','mobile'])->distinct()->where(['mobile'=>'xxxxxxxxxxx'])->all();
所获取的sql如下:
SELECT DISTINCT `user_name`, `mobile` FROM `hundred2_users` WHERE `mobile`='xxxxxxxxxxx';
使用这条sql查询之后大家会发现无法去重,原因是DISTINCT了他后面的两个字段,必须在user_name和mobile都重复的情况下才会去重。为了解决这种尴尬的问题,我们使用以下的方法,已去重mobile为例:
Users::find()->select(['user_name','mobile'])->groupBy(['mobile','user_name'])->where(['mobile'=>'xxxxxxxxxxx']);
会获得以下sql:
SELECT `user_name`, `mobile` FROM `hundred2_users` WHERE `mobile`='xxxxxxxxxxx' GROUP BY `mobile`;
最终取得所需要的数据。