2016-05-05 69 views
2

我不明白爲什麼。 請幫助我 我有客戶表,有很多訂單。所以Customer(id),Order(id,customer_id)。我想讓所有客戶少於100個訂單。所以,我做的SQL查詢的Postgres(我用Rails和ActiveRecord的),但查詢當我有PG :: UndefinedColumn:錯誤

SELECT customers.*, COUNT(*) AS c_c FROM "customers" LEFT OUTER JOIN orders ON orders.customer_id = customers.id GROUP BY "customers"."id" HAVING c_c < 100 OR orders.id IS NULL 

我有一個錯誤

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "c_c" does not exist 

爲什麼?我怎樣才能做到這一點?

+0

您能否包含生成查詢的Rails代碼? –

+0

如果你可以提供我的導軌代碼來完成我的任務,那將是一件好事。我想讓所有客戶少於100個訂單。客戶有很多訂單。 –

回答

1

查詢本身看起來不正確。您不能引用HAVING子句中的別名列。您的COUNT(*)也不明確。您可以通過在HAVINGCOUNT(orders.id)更換c_c修復,並在選擇添加COUNT(orders.id)

SELECT customers.*, COUNT(orders.id) AS c_c FROM "customers" LEFT OUTER JOIN orders ON orders.customer_id = customers.id GROUP BY "customers"."id" HAVING COUNT(orders.id) < 100 OR orders.id IS NULL 

編輯

對於一個ActiveRecord查詢試試這個:

Customer.joins("LEFT JOIN orders ON orders.customer_id = customers.id").group("customers.id").having("COUNT(orders.id) < 100") 

請確保您有在Customer中定義的has_many :orders

+0

我把它綁住了。我有錯誤ActiveRecord :: StatementInvalid:PG :: GroupingError:錯誤:列「orders.id」必須出現在GROUP BY子句中或用於聚合函數 –

+0

您不應該'orders.id'聚合'COUNT'功能。無論如何,請參閱我的ActiveRecord解決方案的更新答案。 –

+0

對不起,我說<100.這意味着0,1,2,99個訂單。這就是爲什麼我使用左連接而不是內連接。我對嗎? –

1

您不能在使用c_c

SELECT customers.*, (
    SELECT COUNT(*) 
    FROM orders 
    WHERE customers.id = orders.customer_id 
) AS c_c 
FROM "customers" 
LEFT OUTER JOIN orders 
ON orders.customer_id = customers.id 
GROUP BY "customers"."id" 
HAVING (SELECT COUNT(*) 
    FROM orders 
    WHERE customers.id = orders.customer_id 
) < 100 OR orders.id IS NULL 
+0

對於非常簡單的操作是非常大的查詢。我只想讓所有客戶少於100個訂單。你確定只有這樣做嗎? –

相關問題