2016-05-05 11 views
2

なぜ私は理解できません。 助けてください 私は多くの注文を持っている顧客テーブルがあります。したがって、顧客(id)、注文(id、customer_id)。 100件未満の注文を受けているすべての顧客を獲得したい。だから私は(私はRailsとActiveRecordのを使用)のpostgresにSQLクエリを実行しますが、クエリは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を交換することにより固定し、SELECTで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 

EDIT

ActiveRecordのクエリでは、これを試してみてください。

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

あなたが持っていることを確認してくださいa は、Customer

+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未満の注文を持っているすべての顧客を取得したい。あなたはそれを行う唯一の方法だと確信していますか? –

関連する問題