Как получить общий номер в отеле и забронированный номер в одном запросе

Как получить общий номер в отеле и забронированный номер в одном запросе.

Я использовал 2 запроса, чтобы получить результат. Мне это нужно в одном запросе.

Проблема, с которой я столкнулся, поскольку все значения указаны в этой таблице htl_room_information.id_hotel

Забронированный номер:

 SELECT x.hotel_name
      , count(i.id_hotel) room 
   FROM htl_booking_detail d
   JOIN htl_branch_info_lang x
     ON x.id=d.id_hotel 
   JOIN htl_room_information i 
     ON d.id_room=i.id 
  group 
     by x.hotel_name;

+------------------------------------------+------+
| hotel_name                               | room |
+------------------------------------------+------+
| hotel                                    |    3 |
| hotel1                                   |    1 |
| hotel2                                   |    4 |
| hotel3                                   |   13 |
| hotel4                                   |    9 |
| hotel5                                   |    3 |
| hotel6                                   |    3 |
| hotel7                                   |    2 |
+------------------------------------------+------+

Всего комнат

SELECT (htl_branch_info_lang.hotel_name) as hotel_name,count(htl_room_information.id_hotel) as total_room FROM htl_room_information ,htl_branch_info_lang where htl_room_information.id_hotel=htl_branch_info_lang.id group by htl_branch_info_lang.hotel_name;

+------------------------------------------+------------+
| hotel_name                               | total_room |
+------------------------------------------+------------+
| hotel                                    |        219 |
| hotel2                                   |         25 |
| hotel3                                   |         16 |
| hotel4                                   |          5 |
| hotel5                                   |         55 |
| hotel6                                   |         27 |
| hotel7                                   |         56 |
| hotel8                                   |         52 |
+------------------------------------------+------------+

Что не так с двумя запросами?

Strawberry 04.12.2018 08:08

Мне нужны эти 2 карьера вместе, чтобы подсчитать общую комнату и забронированную комнату в одном запросе. Затем я прикрепляю это к нашей панели инструментов метабазы.

Krishna Prasad 04.12.2018 08:14
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать подзапрос попробуй это:

SELECT (a.hotel_name) as 
hotel_name,count(htl_room_information.id_hotel) as total_room, (SELECT 
count(htl_room_information.id_hotel) as room FROM htl_booking_detail, 
htl_branch_info_lang b, htl_room_information  WHERE 
b.id=htl_booking_detail.id_hotel and  
htl_booking_detail.id_room=htl_room_information.id and 
b.hotel_name = a.hotel_name), count(htl_room_information.id_hotel) - (SELECT 
count(htl_room_information.id_hotel) as room FROM htl_booking_detail, 
htl_branch_info_lang b, htl_room_information  WHERE 
b.id=htl_booking_detail.id_hotel and  
htl_booking_detail.id_room=htl_room_information.id and 
b.hotel_name = a.hotel_name) as available  FROM htl_room_information 
,htl_branch_info_lang 
a where htl_room_information.id_hotel=a.id group by 
a.hotel_name;

Уважаемый Ренц, он не работает, я вижу ошибку ниже: java.sql.SQLException: Subquery возвращает более 1 строки

Krishna Prasad 04.12.2018 08:08

теперь я получаю ошибку ниже: ОШИБКА 1054 (42S22): Неизвестный столбец 'htl_branch_info_lang.hotel_name' в 'списке полей'

Krishna Prasad 04.12.2018 08:23

@KrishnaPrasad, извините, я не эксперт, просто пытаюсь помочь, но снова отредактировал, вы можете попробовать.

Renz Dominique 04.12.2018 08:27

@ Renz, теперь все работает нормально. Большое Вам спасибо. Теперь мне нужна разница между счетом

Krishna Prasad 04.12.2018 08:35

@KrishnaPrasad Рад, что помог, пожалуйста, проголосуйте за мой ответ и примите его как правильное

Renz Dominique 04.12.2018 08:43

проголосовал спасибо. где я могу добавить столбец с датой между запросами, чтобы я мог фильтровать его по дате

Krishna Prasad 04.12.2018 09:30

@KrishnaPrasad сразу после того, как GROUP BY сделает

Renz Dominique 04.12.2018 09:37

Дело в том, что если я выберу разные даты, это не приведет к вычислению «Доступной комнаты». Фактически доступная комната должна измениться по дате. Но это не расчет. Как я могу получить правильный расчет. where caluse Я добавил это {{from_date}}, чтобы получить дату и дату между датами результата. Бит его не засчитывает свободные номера.

Krishna Prasad 04.12.2018 09:49

Надеюсь, я правильно понял ваш вопрос.

Пожалуйста, проверьте запрос ниже.

select b.hotel_name hotel_name, a.room , 
b.total_room
from
(SELECT htl_branch_info_lang.hotel_name, 
count(htl_room_information.id_hotel) as room FROM htl_booking_detail, 
htl_branch_info_lang, htl_room_information WHERE 
htl_branch_info_lang.id=htl_booking_detail.id_hotel and  
htl_booking_detail.id_room=htl_room_information.id group by 
htl_branch_info_lang.hotel_name ) a RIGHT join (SELECT (htl_branch_info_lang.hotel_name) as 
hotel_name,count(htl_room_information.id_hotel) as total_room 
FROM htl_room_information ,htl_branch_info_lang 
where htl_room_information.id_hotel=htl_branch_info_lang.id 
group by htl_branch_info_lang.hotel_name) b
on a.hotel_name = b.hotel_name
;

Уважаемый Таджиндер, я получаю ошибку ниже: ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования около 'полного внешнего соединения (SELECT (htl_branch_info_lang.hotel_name) как hotel_name, count (h' в строке 1

Krishna Prasad 04.12.2018 08:12

В случае, если это помогло, попросив вас проголосовать за ответ, проследите, чтобы другие пользователи также получили помощь.

Tajinder 04.12.2018 08:49

Извините, что спрашиваю еще раз, дело в том, что мне нужна свободная комната = общая комната - забронированная комната. Как я могу добиться этого по дате или в промежутке между датами. Я использую метабазу для выбора дат в запросе.

Krishna Prasad 04.12.2018 10:07

Используйте зависимые подзапросы.

SELECT x.hotel_name,
    (
      SELECT count(i.id_hotel)  
      FROM htl_booking_detail d
      JOIN htl_room_information i 
         ON d.id_room=i.id 
      WHERE x.id=d.id_hotel 
    ) as room,
    (
      SELECT count(i.id_hotel) 
      FROM htl_room_information i
      WHERE i.id_hotel=x.id 
    ) as total_room 
FROM htl_branch_info_lang x

Я предполагаю, что hotel_name уникален в таблице htl_branch_info_lang. В противном случае вы должны поместить distinct за первым SELECT.

Другие вопросы по теме