2015-01-13 3 views
0

Я пытаюсь вызвать в воображении то, что я думаю, что должно быть довольно простой запрос вСравнить присоединиться отсчет к другому присоединился столбец

Соответствующие модели:

Schedulehas_manyEvents, и в Eventhas_manyattendees. Я хочу получить все events, у которых есть меньше attendees, чем eventschedule's min_attendees column указывает.

SELECT "events".* FROM "events" 
INNER JOIN "schedules" ON "schedules"."id" = "events"."schedule_id" 
INNER JOIN "attendees" ON "attendees"."event_id" = "events"."id" 
GROUP BY events.id 
HAVING COUNT(attendees.id) < schedules.min_attendee 

Я получаю следующее сообщение об ошибке при попытке вышеуказанного запроса: ERROR: column "schedules.min_attendees" must appear in the GROUP BY clause or be used in an aggregate function

+1

Редактировать свой вопрос и добавить запрос. –

+0

Сделано! Добавлен SQL, созданный Rails. – sheldonbaker

ответ

2

Вы можете исправить это с помощью функции агрегирования на нем:

SELECT "events".* 
FROM "events" INNER JOIN 
    "schedules" 
     ON "schedules"."id" = "events"."schedule_id" INNER JOIN 
     "attendees" 
     ON "attendees"."event_id" = "events"."id" 
GROUP BY events.id 
HAVING COUNT(attendees.id) < MIN(schedules.min_attendee) 

Или включить его в group by

SELECT "events".* 
FROM "events" INNER JOIN 
    "schedules" 
     ON "schedules"."id" = "events"."schedule_id" INNER JOIN 
     "attendees" 
     ON "attendees"."event_id" = "events"."id" 
GROUP BY events.id, schedules.min_attendee 
HAVING COUNT(attendees.id) < schedules.min_attendee 
+0

Это было красиво и просто. Благодаря! – sheldonbaker

1

Если вы не ставите функцию агрегата рядом с schedules.min_attendee, тогда он должен присутствовать в группе иначе не нужен.

Это может поможет вам

SELECT "events".* FROM "events" 
INNER JOIN "schedules" ON "schedules"."id" = "events"."schedule_id" 
INNER JOIN "attendees" ON "attendees"."event_id" = "events"."id" 
GROUP BY events.id 
HAVING COUNT(attendees.id) < MAX(schedules.min_attendee) 

Вы ча использовать MAX или MIN, потому что для каждой строки она будет изменяется. Независимо от того, какие столбцы вы используете для SELECT, которые должны быть в предложении GROUP BY, иначе он будет вызывать ошибку (он должен появляться в группе по предложению или agg f'n)

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