短いバージョン:このクエリを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を使ってこれを表現する方法はありますか?
あなたはPostgreSQLのバージョンを教えてください。 –