【发布时间】:2021-05-03 00:25:19
【问题描述】:
我正在尝试将以下 SQL 查询转换为 Rails 可以理解的内容:
SELECT posts.* FROM
(
SELECT group_id, MAX(updated_at) AS updated_at FROM posts WHERE group_id IN (4, 6, 9) GROUP BY group_id
) AS latest_posts
INNER JOIN posts ON
latest_posts.group_id = posts.group_id AND
latest_posts.updated_at = posts.updated_at;
模型的名称是Post。我的尝试:
Post.select("(SELECT group_id, MAX(updated_at) AS updated_at FROM posts WHERE group_id IN (4, 6, 9) GROUP BY group_id) AS latest_posts")
.joins('INNER JOIN posts ON latest_posts.group_id = posts.group_id AND latest_posts.updated_at = posts.updated_at')
错误:
Error:
UserTest#test_feed_should_have_the_right_posts:
ActiveRecord::StatementInvalid: PG::DuplicateAlias: ERROR: table name "posts" specified more than once
test/models/user_test.rb:100:in `block in <class:UserTest>'
更新:关闭但没有雪茄。令人沮丧。
irb(main):046:0> Post.select("posts.* FROM (SELECT group_id, MAX(updated_at) AS updated_at FROM posts WHERE group_id IN (4, 6, 9) GROUP BY group_id) AS latest_posts").joins("INNER J
OIN posts ON latest_posts.group_id = posts.group_id AND latest_posts.updated_at = posts.updated_at")
生产:
SELECT posts.* FROM
(SELECT group_id, MAX(updated_at) AS updated_at FROM posts WHERE group_id IN (4, 6, 9) GROUP BY group_id)
AS latest_posts
FROM "posts"
INNER JOIN posts
ON latest_posts.group_id = posts.group_id AND latest_posts.updated_at = posts.updated_at
【问题讨论】:
-
你可以在链的末尾调用
.to_sql,然后比较SQL -
也许如果你给使用的“posts”表的两个不同实例起别名(即“SELECT”语句中的第一个实例和“INNER JOIN”中的第二个实例,那么它可能会按照您的预期工作。我将作为答案发布,所以您明白我的意思 - 尽管我不是 100% 确定
标签: sql ruby-on-rails