Mysql2 ::错误:'having子句'中的未知列'comments'

时间:2017-08-29 19:39:18

标签: mysql ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord

在控制器中,我有一个带有子选择的activequery来获取计数,并希望使用计数来进一步限制返回的行数。例如,comments = 0

我正在使用,因为这是我在mysql提示符下测试它的唯一方法。检查where子句中的聚合函数不起作用。

有什么想法吗?

最终,我的目标是将其调整为destroy语句以删除符合该条件的值,但我甚至不知道如何做到这一点。所以这意味着只删除hbookmarks表中的行(而不是书签表)。

来自控制器的代码:

Hbookmark.joins("INNER JOIN bookmarks ON hbookmarks.bookmark_id = bookmarks.id")
         .select("bookmarks.short_name, hbookmarks.id, ( select count(*) from clickcomments where clickcomments.click_id = hbookmarks.id ) as comments")
         .where("bookmarks.user_id = ? AND hbookmarks.create_date < DATE_SUB(NOW(), INTERVAL 1 YEAR )", current_user.id)
         .having("comments = 0")
         .order("hbookmarks.create_date desc")

2 个答案:

答案 0 :(得分:0)

之前我遇到过类似的问题,我通过将comments替换为您用来定义它的实际SQL段来解决它:

having("( select count(*) from clickcomments where clickcomments.click_id = hbookmarks.id ) = 0")

答案 1 :(得分:0)

最终它在ActiveRecord上的size命令失败了,我在logger语句中有这个命令。

logger.info("purge size with no comments: " + @topurge.size.to_s)

使用.length不会导致错误,其余查询工作正常。一旦完成,我就注释掉了.length。

正确的方法是:

logger.info("purge size with no comments: " + @topurge.length.to_s)

关于我的另一个问题,如何在ActiveRecord上执行删除,直接转发,destroy_all。现在我的数据库有一些用户拥有1000行,所以在这种情况下,我进入了mysql并进行了快速执行的手术删除,而这种活动记录很慢。有人对Rails内部删除的性能方式有更好,更快,更少的影响,请告诉我。

# remove the old clicks that do not have comments - we'll keep those for search look up
@topurge.destroy_all