胖纸囧 2016-05-18 15:40:40 20277次浏览 6条回复 4 6 0

  假设有表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_namemobile都重复的情况下才会去重。为了解决这种尴尬的问题,我们使用以下的方法,已去重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`;

最终取得所需要的数据。

觉得很赞
  • 回复于 2016-05-19 12:31 举报

    想請問一下 這sql執行是要看 DB 類型嗎?

    目前 MYSQL 印象中可以 ,但有些DB類型是不支援像是
    SELECT 欄位與 GROUP BY 字段 欄位不一致的情形。
    -----------------(當然不包含運算欄位)-----------------

    1 条回复
    回复于 2016-05-19 16:08 回复

    嘿嘿,是我疏忽了,当前我只在mysql下进行过测试,其他的还没试过。

  • 回复于 2017-01-19 14:35 举报

    这样还是有问题,就是获取的可能不是最新的

  • 回复于 2017-02-28 14:49 举报

    可以的,亲测有效~谢谢

  • 回复于 2017-03-13 11:18 举报

    请问在这个需求基础上,获取最新的有没有什么思路

    2 条回复
    回复于 2017-03-13 12:47 回复

    哥们你为毛不排序。

    回复于 2017-03-13 15:08 回复

    因为涉及到一个create时间戳字段.groupby排重之后得到的是最早的数据.排序的话只能对排重之后的数据排序.不能在排重时groupby的过程中排序. 说起来有点拗口 .
    已经解决了,用子查询解决的 . 类似这个问题http://stackoverflow.com/questions/38349131/mysql-select-subquery-in-yii2

    觉得很赞
  • 回复于 2017-03-31 15:17 举报

    find()->select(['id','user_id','project'])->groupBy('user_id')->all();

  • 回复于 2017-09-22 14:07 举报

    楼主问题解决的吗,我也遇到了,distinct 去重没用

    1 条回复
    回复于 2017-09-22 14:11 回复

    搞明白了,但我不适用。。

您需要登录后才可以回复。登录 | 立即注册