【问题标题】:How to get the last entered record field in rails with join and group by?如何通过加入和分组获取rails中最后输入的记录字段?
【发布时间】:2019-10-30 08:15:31
【问题描述】:

我正在使用带有 ruby​​ 2.4 的 rails 5.1 并且我被困在 rails Active record 查询中,我已经在 SQL 中完成了它,但无法以 rails 方式复制它。请建议正确的语法,在此先感谢。 Sql查询是:

select jobs.id, users.first_name, users.last_name, users.email, MAX(comments.created_at) from comments left join jobs on jobs.id = comments.job_id left join users on users.id = jobs.user_id group by jobs.id;

rails中对应的查询是:

Comment.joins("left join jobs on jobs.id = comments.job_id").joins("left join users on users.id = jobs.user_id").select("jobs.id, users.first_name, users.last_name, users.email, max(comments.created_at)").group_by("jobs.id")

出现以下错误:

Completed 500 Internal Server Error in 151ms (ActiveRecord: 6.1ms)

ArgumentError (wrong number of arguments (given 1, expected 0)):

输出应为:

+-------+------------+-----------+------------------------+--------------------------+
| id    | first_name | last_name | email                  | MAX(comments.created_at) |
+-------+------------+-----------+------------------------+--------------------------+
| 63606 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-18 05:19:30      |
| 63608 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-26 09:22:21      |
| 63610 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 12:27:24      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 12:15:36      |
| 63684 | vidur      | punj      | vidur.punj@hotmail.com | 2019-10-15 11:46:45      |
| 63690 | vidur      | punj      | vidur.punj@hotmail.com | 2019-06-12 05:29:04      |
| 63694 | vidur      | punj      | vidur.punj@hotmail.com | 2019-05-23 04:03:01      |
| 63700 | vidur      | punj      | vidur.punj@hotmail.com | 2019-05-20 10:55:31      |
| 63701 | vidur      | punj      | vidur.punj@hotmail.com | 2019-10-19 10:07:42      |
| 63704 | vidur      | punj      | vidur.punj@hotmail.com | 2019-06-13 09:52:50      |
| 63705 | vidur      | punj      | vidur.punj@hotmail.com | 2019-06-11 11:16:35      |
| 63706 | vidur      | punj      | vidur.punj@hotmail.com | 2019-06-11 11:15:21      |
| 63708 | vidur      | punj      | vidur.punj@hotmail.com | 2019-06-13 12:44:19      |
| 63709 | vidur      | punj      | vidur.punj@hotmail.com | 2019-06-11 11:13:48      |
| 63717 | vidur      | punj      | vidur.punj@hotmail.com | 2019-06-17 09:42:35      |
| 63719 | vidur      | punj      | vidur.punj@hotmail.com | 2019-06-17 10:38:51      |
| 63726 | vidur      | punj      | vidur.punj@hotmail.com | 2019-06-20 10:55:44      |
| 63727 | vidur      | punj      | vidur.punj@hotmail.com | 2019-06-25 04:57:45      |
| 63741 | vidur      | punj      | vidur.punj@hotmail.com | 2019-07-22 06:51:53      |
| 63778 | vidur      | punj      | vidur.punj@hotmail.com | 2019-09-13 11:30:56      |
| 63801 | vidur      | punj      | vidur.punj@hotmail.com | 2019-09-16 06:55:08      |
| 63802 | vidur      | punj      | vidur.punj@hotmail.com | 2019-09-17 03:56:27      |
| 63815 | vidur      | punj      | vidur.punj@hotmail.com | 2019-10-30 05:43:07      |
| 63821 | vidur      | punj      | vidur.punj@hotmail.com | 2019-10-15 10:40:54      |
| 63839 | vidur      | punj      | vidur.punj@hotmail.com | 2019-09-23 11:07:30      |
| 63898 | vidur      | punj      | vidur.punj@hotmail.com | 2019-10-29 07:12:15      |
| 63916 | vidur      | punj      | vidur.punj@hotmail.com | 2019-10-15 12:51:06      |
+-------+------------+-----------+------------------------+--------------------------+

代替:

+-------+------------+-----------+------------------------+--------------------------+
| id    | first_name | last_name | email                  | max(comments.created_at) |
+-------+------------+-----------+------------------------+--------------------------+
| 63606 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-18 05:18:27      |
| 63606 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-18 05:19:30      |
| 63608 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-18 11:06:48      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 05:33:57      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:04:16      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:49:08      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:49:49      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:50:41      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:51:27      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:52:17      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:52:48      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:53:31      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:53:46      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:54:07      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:54:27      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:54:45      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:55:28      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 06:58:00      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 08:41:57      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 09:08:07      |
| 63611 | vidur      | punj      | vidur.punj@hotmail.com | 2019-04-22 09:08:34      |

【问题讨论】:

    标签: mysql ruby ruby-on-rails-5.1 rails-5.1.6


    【解决方案1】:

    我想是你的group_by。这是一个香草红宝石枚举。你试过.group('jobs.id')吗? group 是一个 activerecord 查询助手,它将运行 sql group by 子句

    【讨论】:

    • 是的,它给出的错误是:ActiveRecord::StatementInvalid: Mysql2::Error: Expression #1 of ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列 'TukaWeb_development.cmets.id'在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容:SELECT jobs.id, users.first_name, users.last_name, users.email, max(cmets.created_at) FROM comments left join jobs on jobs.id = cmets.job_id left join users on users.id = jobs.user_id GROUP BY jobs.id ORDER BY comments.id DESC LIMIT 11
    • 我认为错误消息是说在组中包含comments.id。我有时不得不在组子句.group('jobs.id, comments.id') 中处理事物的顺序
    • 但输出不正确,显示的是jobs上的所有cmet,但需要的是jobs列表上的最新评论。
    • 我认为您可以将 max(comments.created_at) 从选择中取出并将 maximum(comments.created_at) 添加到查询中
    • 它给出了以下错误:ActiveRecord::StatementInvalid: Mysql2::Error: FUNCTION TukaWeb_development.maximum 不存在:SELECT jobs.id, users.first_name, users.last_name, users.email, maximum( cmets.created_at) FROM comments left join jobs on jobs.id = cmets.job_id left join users on users.id = jobs.user_id GROUP BY jobs.id, cmets.id ORDER BY comments.id DESC
    【解决方案2】:
    Comment.joins("left join jobs on jobs.id = comments.job_id").joins("left join users on users.id = jobs.user_id").select("jobs.id, users.first_name, users.last_name, users.email, max(comments.created_at)").group("jobs.id, comments.id")
    

    【讨论】:

      猜你喜欢
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2020-03-23
      相关资源
      最近更新 更多