需要解決的問題:假設有表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`;
最終取得所需要的數據。