2012-03-19 15 views
3

短いバージョン:このクエリをsqueelに書き込むにはどうすればよいですか?スクロールのネストされたクエリ

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 

ロングバージョン:rocket_tagは、モデルに簡単なタグを追加する逸品です。メソッドtagged_withを追加します。モデルがUserで、IDと名前があるとすればUser.tagged_with ['admin','sales']を呼び出すことができます。

このクエリを生成
select{count(~id).as(tags_count)} 
.select("#{self.table_name}.*"). 
joins{tags}. 
where{tags.name.in(my{tags_list})}. 
group{~id} 

:内部的には、このsqueelコードを使用しています

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は文句:

ERROR: column "users.name" must appear in the GROUP BY 
clause or be used in an aggregate function 

私はより快適な道を信じてクエリを書くには:

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 

squeelを使ってこれを表現する方法はありますか?

+0

あなたはPostgreSQLのバージョンを教えてください。 –

答えて

2

Squeelについてはわかりませんが、表示されるエラーはPostgreSQLをアップグレードすることで修正できます。

Some RDBMSs are happy with this, but postgres complains:

ERROR: column "users.name" must appear in the GROUP BY clause or be used in an aggregate function

あなたは、GROUP BYの主キーを一覧表示したら、この表のための追加の列をスキップして、まだSELECTリスト内でそれらを使用することができ、PostgreSQLの9.1以降で。 release notes for version 9.1教えてください:


ところで、あなたの代わりのクエリを簡素化することができる

Allow non-GROUP BY columns in the query target list when the primary key is specified in the GROUP BY clause

、追加 DISTINCTが冗長になります。

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 
+0

これは本当に知って良いことです、ありがとう!残念ながら私はherokuでアプリケーションを実行しているので、8.3から9.1へのアップグレードは少なくとも月に200ドルかかりますが、問題が古いバージョンのpostgresに固有のものなら、私はfind_by_sql。私はまだ質問がこのような種類のsqueelを使用することができます場合でも興味があります。 – dslh

+0

@dslh:[Heroku Labsは既に9.1を提供しています。](http://devcenter.heroku.com/articles/labs-heroku-shared-postgresql)興味があるかもしれません。 –

+0

それは私の質問に答えることはできませんが、それは私の問題を解決しました。私は間違った質問をしていたと思う。どうもありがとう! – dslh

関連する問題