[胖纸囧]Yii2 AR查询多字段结果去重 [ 技术分享 ]
假设有表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`;
最终取得所需要的数据。
共 6 条回复
-
请问在这个需求基础上,获取最新的有没有什么思路
共 2 条回复@胖纸囧 因为涉及到一个create时间戳字段.groupby排重之后得到的是最早的数据.排序的话只能对排重之后的数据排序.不能在排重时groupby的过程中排序. 说起来有点拗口 .
已经解决了,用子查询解决的 . 类似这个问题http://stackoverflow.com/questions/38349131/mysql-select-subquery-in-yii2胖纸囧 觉得很赞
胖纸囧 四川成都
注册时间:2013-07-17
最后登录:2017-12-27
在线时长:221小时19分
最后登录:2017-12-27
在线时长:221小时19分
- 粉丝185
- 金钱21126
- 威望150
- 积分24836