Я пытаюсь написать запрос, чтобы получить информацию о курсах, а также количество заказов и посетителей. У каждого курса может быть много заказов, и в каждом бронировании может быть много участников.Быстрый комплексный запрос для выбора заказов
У нас уже есть рабочий отчет, но он использует несколько запросов для получения требуемой информации. Один, чтобы получить курсы, один, чтобы получить заказы, и один, чтобы получить количество участников. Это очень медленно, потому что размер базы данных вырос.
Есть целый ряд дополнительных условий для докладов:
- Бронирование должно быть сделано более 5 минут назад, или были подтверждены
- Бронирование не должно быть отменено
- Курс не должны быть помечены как удаленные
- Место и место проведения курсов должны быть
LIKE
строка поиска - Курсы без заказов должны быть указаны в Результаты
Это структура таблицы: (Я опустил ненужную информацию. Все поля не являются нулевыми и не имеют значения по умолчанию)
mysql> DESCRIBE first_aid_courses;
+------------------+--------------+-----+----------------+
| Field | Type | Key | Extra |
+------------------+--------------+-----+----------------+
| id | int(11) | PRI | auto_increment |
| course_date | date | | |
| region_id | int(11) | | |
| location | varchar(255) | | |
| venue | varchar(255) | | |
| number_of_spaces | int(11) | | |
| deleted | tinyint(1) | | |
+------------------+--------------+-----+----------------+
mysql> DESCRIBE first_aid_bookings;
+-----------------------+--------------+-----+----------------+
| Field | Type | Key | Extra |
+-----------------------+--------------+-----+----------------+
| id | int(11) | PRI | auto_increment |
| first_aid_course_id | int(11) | | |
| placed | datetime | | |
| confirmed | tinyint(1) | | |
| cancelled | tinyint(1) | | |
+-----------------------+--------------+-----+----------------+
mysql> DESCRIBE first_aid_attendees;
+----------------------+--------------+-----+----------------+
| Field | Type | Key | Extra |
+----------------------+--------------+-----+----------------+
| id | int(11) | PRI | auto_increment |
| first_aid_booking_id | int(11) | | |
+----------------------+--------------+-----+----------------+
mysql> DESCRIBE регионы;
+----------+--------------+-----+----------------+
| Field | Type | Key | Extra |
+----------+--------------+-----+----------------+
| id | int(11) | PRI | auto_increment |
| name | varchar(255) | | |
+----------+--------------+-----+----------------+
нужно выбрать следующее:
Course ID: first_aid_courses.id
Date: first_aid_courses.course_date
Region regions.name
Location: first_aid_courses.location
Bookings: COUNT(first_aid_bookings)
Attendees: COUNT(first_aid_attendees)
Spaces Remaining: COUNT(first_aid_bookings) - COUNT(first_aid_attendees)
Это то, что я до сих пор:
SELECT `first_aid_courses`.*,
COUNT(`first_aid_bookings`.`id`) AS `bookings`,
COUNT(`first_aid_attendees`.`id`) AS `attendees`
FROM `first_aid_courses`
LEFT JOIN `first_aid_bookings`
ON `first_aid_courses`.`id` =
`first_aid_bookings`.`first_aid_course_id`
LEFT JOIN `first_aid_attendees`
ON `first_aid_bookings`.`id` =
`first_aid_attendees`.`first_aid_booking_id`
WHERE (`first_aid_courses`.`location` LIKE '%$search_string%'
OR `first_aid_courses`.`venue` LIKE '%$search_string%')
AND `first_aid_courses`.`deleted` = 0
AND (`first_aid_bookings`.`placed` > '$five_minutes_ago'
AND `first_aid_bookings`.`cancelled` = 0
OR `first_aid_bookings`.`confirmed` = 1)
GROUP BY `first_aid_courses`.`id`
ORDER BY `course_date` DESC
Его не совсем работает, может ли один помочь мне с написанием правильного запрос? Кроме того, в этой базе данных есть 1000 строк, поэтому любая помощь в ее быстром использовании (например, индексы).
Как это «не работает»? –
Количество заказов/посетителей неверно – Petah