2012-03-19 95 views
3

短版本:如何在squeel中編寫此查詢?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']。在內部它使用此squeel代碼:

select{count(~id).as(tags_count)} 
.select("#{self.table_name}.*"). 
joins{tags}. 
where{tags.name.in(my{tags_list})}. 
group{~id} 

生成此查詢:

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版本? – 2012-03-19 07:22:09

回答

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

從PostgreSQL 9.1開始,一旦你列出的組的主鍵由用戶可以跳過其它列此表,並仍然在SELECT列表中使用它們。該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 2012-03-19 10:20:32

+0

@dslh:[Heroku Labs已經提供9.1](http://devcenter.heroku.com/articles/labs-heroku-shared-postgresql)。你可能會感興趣。 – 2012-03-19 12:46:46

+0

這不回答我的問題,但它確實解決了我的問題。我想我問的是錯誤的問題。非常感謝! – dslh 2012-03-22 20:02:47