Как использовать sql подзапрос, который использует счетчик

0

У меня есть система, в которой резервирование хранится как записи в одной таблице (workshop_reservation) и сеансы (зарезервированные вещи) хранятся в другой таблице (сеансе). Каждое резервирование относится к сеансу, и каждый сеанс принадлежит мастерской.

Я хочу сделать запрос mysql, который найдет количество резервирований для каждого сеанса, принадлежащего определенной мастерской. Я пытался использовать count(), чтобы найти количество оговорок в данном сеансе, и этот запрос отлично подходит для этой цели (# - номер сеанса):

SELECT count( r.id )
FROM workshop_reservation AS `r`
WHERE r.session_id = #

Я хочу выяснить, как выполнить этот запрос для каждого сеанса. Я могу легко найти каждый session_id, используя следующий запрос:

SELECT s.id
FROM session AS `s` 

Моя проблема заключается в их объединении, потому что когда какая-либо из сеансов не имеет оговорок, для этой сессии не печатается ни одна строка. Вместо этого я хочу, чтобы он печатал 0 в столбце count для сеансов, которые не имеют оговорок. Следующий запрос отлично подходит для сеансов, которые имеют по крайней мере одно резервирование, но игнорирует сеансы, которые не имеют оговорок (не печатает строку, говорящую 0).

SELECT count( r.id ) , r.session_id
FROM workshop_reservation AS `r`
WHERE r.session_id
IN (
SELECT s.id
FROM session AS `s`
WHERE s.workshop_id =1
)
AND r.reservation_status_id =0
GROUP BY r.session_id

Как я могу заставить его печатать строку с 0 в ней в этой ситуации?

Теги:
count

4 ответа

0
Лучший ответ

Я подумал, что я должен поставить это здесь вместо того, чтобы выбрать один из ваших ответов, поскольку ни один из них не работал самостоятельно. Я использовал элементы из обоих (в основном mdma с одной строкой из nico). Вот запрос, который делает именно то, что я хочу:

SELECT session.id, count( workshop_reservation.id )
FROM session LEFT JOIN workshop_reservation ON session.id = workshop_reservation.session_id
AND workshop_reservation.reservation_status_id =0
GROUP BY session.id

Я не знаю, насколько это очевидно для экспертов SQL, но если AND изменен на WHERE, резервное_status_id фактически игнорируется.

  • 0
    Извините, Скотт, я думаю, что это была опечатка с моей стороны ... а что если вместо этого вы используете HAVING ? Я думаю, что проблема в том, что WHERE не работает с COUNT .
  • 0
    Использование HAVING вместо AND приводит к синтаксической ошибке. Я не уверен, что знаю, что вы имеете в виду. Использование WHERE приводит только к каждому резервированию для подсчитываемого сеанса, независимо от его booking_status_id.
Показать ещё 1 комментарий
3

Вам не нужен подзапрос. Вы можете использовать простой GROUP BY, который будет возвращать 0, если нет оговорок для данного сеанса или количества резервирований.

SELECT s.id, count( r.id )
FROM session AS 's' LEFT JOIN workshop_reservation AS `r`
ON s.id=r.session_id
GROUP BY s.id
  • 0
    +1 Это именно то, что я только что выписал ...
1

Вам нужно использовать JOIN

Например

SELECT COUNT( r.id ) , r.session_id
FROM workshop_reservation r
LEFT JOIN sessions s ON r.session_id = s.id
AND r.reservation_status_id =0
GROUP BY r.session_id
0
select s.*, count(wr.id) as num from sessions as s 
  left join workshop_reservation as wr on wr.session_id = s.id
group by s.id

Ещё вопросы

Сообщество Overcoder
Наверх
Меню