Rails 如何按照创建时间降序排列 再按照 system_id 去重??

CharlesZCB · 2018年09月27日 · 最后由 bakadia 回复于 2018年10月03日 · 1683 次阅读
FalseFeedback.order("created_at desc").group("system_id")

这句话 最后是去重了 但是没有按照降序排列 请问怎么修改

(第一列是id   第三列是system_id  第五列是ceated_at)
48      2  1    1   2018-09-27 15:39:26 1   22                          2018-09-27 15:39:26 22      
47      1   1   1   2018-09-27 14:39:55 1   huhu                            2018-09-27 14:39:55 huhu        
46      1   1   1   2018-09-27 13:58:36 1   333                         2018-09-27 13:58:36 33      
45      1   1   1   2018-09-27 13:31:13 1   we                          2018-09-27 13:31:13 we      
44      1   2   1   2018-09-27 13:24:22 1   111                 13      2018-09-27 13:24:22 1111    1   2018-09-27 14:49:48
43      2   2   1   2018-09-27 13:21:41 1   32                          2018-09-27 13:21:41 22      
42      2   2   1   2018-09-27 13:20:10 1   44                          2018-09-27 13:20:10 44      
41      1   3   1   2018-09-27 13:18:10 1   11                          2018-09-27 13:18:10 1       
40      2   1   1   2018-09-27 13:17:49 1   2                           2018-09-27 13:17:49 2       
39      1   2   1   2018-09-27 13:17:26 1   1                           2018-09-27 13:17:26 1       

现在的语句只能查到  39  40 的数据
我现在想查到 48 和44的

distinct ?😀

winse 回复

不好使啊 我之前用了 而且带有 select 的 最后集合对象中的每一个对象 都不能得到所有属性值 不晓得咋回事

FalseFeedback.select('max(created_at) as created_at , system_id').group("system_id").order('created_at desc')

解决

group 是分组吧

你现在的这条语句只能查到 39 40 的数据?我怎么有点不相信呢

FalseFeedback.order("created_at desc").group("system_id")

你这样生成的 SQL 在逻辑上是错误的,需要补一下 SQL 知识再使用 Active Record

你说的这两种方式在 mysql 都不行,都是先 group,较小的那个 ID 为去重以后的记录。

FalseFeedback.order("created_at desc").group("system_id")
SELECT * FROM false_feed_backs GROUP BY system_id ORDER BY created_at DESC 

FalseFeedback.select('max(created_at) as created_at , system_id').group("system_id").order('created_at desc')
SELECT max(created_at) as created_at, system_id FROM false_feed_backs GROUP BY system_id ORDER BY created_at DESC 

可以这样

SELECT system_id,created_at 
FROM (
    SELECT system_id,created_at
    FROM false_feed_backs
    ORDER BY created_at DESC
) t
GROUP BY system_id
dontyang 回复
SELECT system_id,created_at 
FROM (
    SELECT system_id,created_at
    FROM false_feed_backs
    ORDER BY created_at DESC
) t
GROUP BY system_id

你这个子查询看上去没有意义啊,另外写了 GROUP BY system_id 但是 created_at 不用聚合函数,逻辑上看还是不对。。

使用 group by 的时候,select 出来的多个列,要么在 group by 列表中,要么使用聚合函数

其余的数据库不知道,Mysql select 的列可以不用都写在 group by 里面啊

dontyang 回复

如果不在 group by 里,就必须在聚合函数里。你的 MySQL 是哪个版本?老版本可能不一样

https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

SELECT * FROM (SELECT * FROM false_feed_backs ORDER BY created_at DESC) AS T GROUP BY T.system_id
victor 回复

还是只适用于老版本,MySQL 的不严谨坑了好多人。。。

hellorails 回复

我测试该语句的环境 mysql Ver 15.1 Distrib 10.3.9-MariaDB, for osx10.13 (x86_64) using readline 5.1

你指的新版本是?

victor 回复

https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

你的是 MariaDB,可能会有些区别(https://mariadb.com/kb/en/library/sql-mode/

MariaDB ONLY_FULL_GROUP_BY: For SELECT ... GROUP BY queries, disallow SELECTing columns which are not referred to in the GROUP BY clause, unless they are passed to an aggregate function like COUNT() or MAX(). Produce a 1055 error.

我是分别在 MySQL 5.5.54 和 5.7.23 下测试的

FalseFeedback.group("system_id").having('max(system_id)').order("created_at desc") 这样可以吗

需要 登录 后方可回复, 如果你还没有账号请 注册新账号