Tag: sql

使用带有多个数据库表语句的`INNER JOIN`时意味着什么?

我正在使用Ruby on Rails 3.2.2和MySQL。 我有一个生成以下SLQ查询的方法( has_many :through ActiveRecord::Associations ): SELECT DISTINCT `articles`.* FROM `articles` INNER JOIN `articles_comments_associations` `comment_associations_articles` ON `comment_associations_articles`.`article_id` = `articles`.`id` INNER JOIN `articles_comments_associations` ON `articles`.`id` = `articles_comments_associations`.`article_id` WHERE `articles_comments_associations`.`comment_id` = 223 AND (articles_comments_associations.user_id IN (2)) 我想理解INNER JOIN ‘articles_comments_associations’ ‘comment_associations_articles’ ( 注意 : INNER JOIN有多个数据库表语句)以及SQL查询如何工作,因为我没有名为comment_associations_articles的数据库表 。 这是一个错误 (即使它按预期工作) ?

Rails有活跃记录一次性获取所有需要的关联吗?

我有一个模型评论,其中有一个用户。 在我的显示页面中,我正在做一个Comment.all ,然后显示每个评论。 在视图中,我不仅需要显示注释,还需要显示关联用户(即作者)的信息。 …etc… 这很好,所有,但activerecord将其转换为一个SELECT * FROM users WHERE USER.id = commentId查询每个EACH评论我有。 这有点荒谬,特别是在有数百条评论的页面上。 (那是数百个单独的DB命中!) 当我在做Comment.all时,有没有告诉rails不仅要抓取评论,还要抓住相关用户,然后当我稍后调用comment.user.blah时,为了不再从db中获取它? (这样它就可以在一个db语句中完成所有操作)。

Ruby-on-Rails:如何从数据库表的有限子集中提取最新的条目

想象一下像模特这样的用户谁有很多朋友,每个人都有很多评论,我试图向用户显示他的朋友最新的100条评论。 是否有可能在单个SQL查询中提取最新的100个,或者我将不得不使用Ruby应用程序逻辑来解析更大的列表或进行多个查询? 我看到了两种解决方法: 从User.find开始,使用一些复杂的组合:join和:limit。 这种方法看起来很有希望,但不幸的是,它会让我回复用户而不是评论,一旦我得到回复,我会有很多模型占用内存(对于每个朋友和用户),许多不必要的字段被转移(一切对于用户,以及关于朋友的名称行的所有内容),我仍然需要以某种方式逐步收集并排序应用程序逻辑中的所有注释。 从评论开始并使用某种find_by_sql,但我似乎无法弄清楚我需要放入什么。我不知道你怎么能得到必要的信息来传递它来限制它只看朋友的评论。 编辑 :我很难让EmFi的解决方案工作,并且会欣赏任何人都可以提供的任何见解。 朋友是通过连接表的循环关联。 has_many :friendships has_many :friends, :through => :friendships, :conditions => “status = #{Friendship::FULL}” 这是我在相关部分得到的错误: 错误:列users.user_id不存在 : SELECT “comments”.* FROM “comments” INNER JOIN “users” ON “comments”.user_id = “users”.id WHERE ((“users”.user_id = 1) AND ((status = 2))) 当我刚进入user.friends,它工作时,这是它执行的查询: : SELECT “users”.* FROM “users” INNER JOIN “friendships” ON “users”.id = […]

Rails以哪种顺序进行数据库查询

在Rails Anurag随机选择n个对象时,我们建议这个答案随机选择n个post,票数> = x Post.all(:conditions => [“votes >= ?”, x], :order => “rand()”, :limit => n) 我担心的是,超过x票的post数量非常多。 数据库将此条件应用于查询的顺序是什么? 可以 (a)选择n个投票> x的post,然后将其随机化? 要么 (b)选择所有票数> x的post,然后随机选择n个post? (c)其他?

需要sql查询帮助来查找具有最多指定标签的内容

假设我有以下表格: TAGS id:整数 name:string post id:整数 主体 引用的Tagging id:整数 tag_id:整数 post_id:整数 我将如何编写一个查询,按照包含最多数量的以下标记的post的顺序选择所有post(标签表的名称属性):“Cheese”,“Wine”,“Paris”,“Frace”,“城市“,”风景“,”艺术“ 另请参阅: 需要有关sql查询的帮助以查找标记有所有指定标记的内容 (注意:类似,但不重复!)

SQL查询返回nil表中没有的日期

我有一个表’my_table’。 它有以下数据: ID — Date 1 — 01/30/2012 2 — 01/30/2012 3 — 05/30/2012 我可以编写一个SQL查询来返回特定日期之间ID的计数,按月分组,如下所示: {“01/30/2012” => 2, “05/30/2012” => 1} 如何在请求的日期之间得到一个值为’0’的所有缺失月份的结果,如下所示: {“01/30/2012” => 2, “02/30/2012” => 0, “03/30/2012” => 0, “04/30/2012” => 0, “05/30/2012” => 1} 提前致谢。

如何自定义Devise以在会话中存储更多信息?

似乎当Devise记录用户时,只有用户ID存储在会话中。 这意味着每次调用current_user都会导致SQL查询(类似于User.find(:id) )来创建User对象,这在很多情况下是不必要的加载。 例如,我们可能希望在右上方的标题中显示用户的名称,该标题位于布局文件中并在每个响应中呈现。 为此,我们可能只编写current_user.name ,这会导致对users表的SQL查询。 我真的想在会话中存储当前用户的一些基本信息(例如名称和电子邮件),以避免额外的SQL查询。 这个问题的正确解决方案是什么?

查询int是否在数组列内,Postgres with Rails

我有一个表格,其中包含整数数组类型的列。 给定一个整数作为输入,我想查询名为tipo_propiedad的列包含输入整数的行。 直接在Postgres中,可以使用&&运算符并将输入int转换为数组。 问题是使用这个: Zone.where(“tipo_propiedad && ?”, [].push(type)).count 其中type是输入整数,给出 SELECT COUNT(*)FROM“zonas”WHERE(tipo_propiedad && 1)PG :: UndefinedFunction:ERROR:operator不存在:integer [] && integer 我也尝试过 Zone.where(“tipo_propiedad && ?”, [5].push(type)) 因为tipo_propiedad里面只有1,2或3个而且给出了 SELECT COUNT(*)FROM“zonas”WHERE(tipo_propiedad && 5,1)PG :: UndefinedFunction:ERROR:operator不存在:integer [] && integer 我也在使用squeel但是gem没有任何操作符来执行此操作。

Rails:如何将facet与搜索结果一起使用

我有一个导轨应用程序,我正在寻找维修店。 搜索类方法如下所示: def self.search(params) if params repairshop = Repairshop.where(:approved => true) if params[:radius].present? repairshop = repairshop.near(params[:location], params[:radius]) if params[:location].present? else repairshop = repairshop.near(params[:location], 200) if params[:location].present? end if params[:keywords].present? repairshop = repairshop.joins(:specializations).joins(:brands_we_services).where(“LOWER(specializations.title) LIKE ? OR LOWER(brands_we_services.title) LIKE ? OR LOWER(repairshop.title) LIKE ?”, “%#{params[:keywords].downcase}%”, “%#{params[:keywords].downcase}%”, “%#{params[:keywords].downcase}%”) end repairshop.uniq else all end end 维修店可以有许多专业和品牌_we_services。 因此,从其他参数中搜索所有名称非常重要。 搜索表单如下所示: 一切正常。 […]

通过两个“has_many”子表的总和来排序查询?

在我的应用程序中, Invoice has_many item_numbers和Invoice has_many payments 。 每张发票都有一个余额,它是ItemNumber金额属性的总和,减去付款金额属性的总和。 在发票模型中很容易计算余额,但我正在尝试编写一个按余额对发票进行排序的查询,这在ActiveRecord / SQL中更难实现。 我已成功设法使用以下查询在item_numbers的总数上订购发票(感谢Daniel Rikowski): Invoice.where(user_id: 1, deleted: false, status: ‘Sent’) .joins(:item_numbers) .select(‘invoices.*, sum(item_numbers.amount)’) .group(‘invoices.id’) .order(‘sum(item_numbers.amount) asc’) .limit(20) 我试图通过下面的平衡来扩展这个顺序; Invoice.where(user_id: 1, deleted: false, status: ‘Sent’) .joins(:item_numbers) .joins(“FULL OUTER JOIN payments ON payments.invoice_id = invoices.id”) .select(“invoices.*, sum(item_numbers.amount_with_gst) – COALESCE(sum(payments.amount), 0)”) .group(“invoices.id”) .order(“sum(item_numbers.amount_with_gst) – COALESCE(sum(payments.amount), 0) #{dir}”)/ 此查询存在两个问题。 首先,它非常丑陋,其次,它不起作用。 […]