首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >squeel中的嵌套查询

squeel中的嵌套查询
EN

Stack Overflow用户
提问于 2012-03-19 00:17:07
回答 1查看 1.2K关注 0票数 3

简短的版本:我如何用squeel写这个查询?

代码语言:javascript
复制
SELECT OneTable.*, my_count
FROM   OneTable JOIN (
  SELECT DISTINCT one_id, count(*) AS my_count
  FROM   AnotherTable
  GROUP BY one_id
) counts
ON OneTable.id=counts.one_id

长版本:标签是一个gem,它为模型添加了简单的标记。它添加了一个方法tagged_with。假设我的模型是User,有一个id和名称,我可以调用User.tagged_with ['admin','sales']。在内部,它使用以下吱吱代码:

代码语言:javascript
复制
select{count(~id).as(tags_count)}
.select("#{self.table_name}.*").
joins{tags}.
where{tags.name.in(my{tags_list})}.
group{~id}

生成此查询:

代码语言:javascript
复制
SELECT count(users.id) AS tags_count, users.*
  FROM users INNER JOIN taggings
    ON taggings.taggable_id = users.id
   AND taggings.taggable_type = 'User'
  INNER JOIN tags
    ON tags.id = taggings.tag_id
  WHERE tags.name IN ('admin','sales')
  GROUP BY users.id

有些RDBMS对此很满意,但postgres抱怨道:

代码语言:javascript
复制
ERROR: column "users.name" must appear in the GROUP BY
clause or be used in an aggregate function

我相信写这个查询的一个更好的方法是:

代码语言:javascript
复制
SELECT users.*, tags_count FROM users INNER JOIN (
  SELECT DISTINCT taggable_id, count(*) AS tags_count
    FROM taggings INNER JOIN tags
      ON tags.id = taggings.tag_id
    WHERE tags.name IN ('admin','sales')
    GROUP BY taggable_id
  ) tag_counts
  ON users.id = tag_counts.taggable_id

有没有办法用尖叫声来表达这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-19 07:26:35

我不知道Squeel,但是您看到的错误可以通过升级PostgreSQL来修复。

有些RDBMS对此很满意,但postgres抱怨道: 错误:列"users.name“必须出现在GROUP子句中或在聚合函数中使用

从PostgreSQL 9.1开始,一旦您按组列出主键,您就可以跳过此表的其他列,并仍然在选择列表中使用它们。9.1版发行说明告诉我们:

在GROUP BY子句中指定主键时,允许查询目标列表中的非组按列。

顺便说一句,您的替代查询可以简化,额外的DISTINCT将是多余的。

代码语言:javascript
复制
SELECT o.*, c.my_count
FROM   onetable o
JOIN (
  SELECT one_id, count(*) AS my_count
  FROM   anothertable
  GROUP  BY one_id
) c ON o.id = counts.one_id
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9763538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档