2016-05-05 3 views
2

Не понимаю, почему. Помогите мне пожалуйста У меня есть таблица Customer, у которой много заказов. Заказчик (id), Order (id, customer_id). Я хочу получить всех клиентов, у которых менее 100 заказов. Так что я SQL запрос к Postgres (я использую Rails и ActiveRecord), но запросКогда у меня есть PG :: UndefinedColumn: ERROR

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 (*) неоднозначен. Вы можете исправить, заменив c_c с COUNT(orders.id) в HAVING, и добавить COUNT(orders.id) в SELECT:

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 has_many :orders, определенном в Customer

+0

Я связал его. У меня есть ошибка ActiveRecord :: StatementInvalid: PG :: GroupingError: ERROR: столбец «orders.id» должен появиться в предложении GROUP BY или использоваться в агрегированной функции. –

+0

. Вы не должны «order.id» агрегируются 'COUNT'. В любом случае, см. Мой обновленный ответ для решения в ActiveRecord. –

+0

Извините, я сказал <100. Это означает 0, 1, 2, 99 заказов. Вот почему я использую Left join вместо внутреннего соединения. Я прав? –

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 заказов. Вы уверены, что это единственный способ сделать это? –

Смежные вопросы