2015-11-04 5 views
-2

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

У меня есть две таблицы

Rooms Details 
rID  | Room Number  | No of persons | 
1  | Room23   |  2   | 
2  | Room24   |  1   | 


Allocated Users 

rID* | user Name | 
1  |  manueis | 

Как я могу проверить, если room23 остается с человеком, а затем установка следующего пользователя в комнату.

+0

Установить статус в комнате и запросить таблицу для комнаты, которая доступна, и количество человек, которое она может иметь –

ответ

0

На самом деле это зависит от того, на что вы хотите получить результаты возврата.

Чтобы получить номера вместе с количеством «выделенных пользователей», вы запускаете такой запрос.

SELECT r.rid 
    , r.no_of_persons 
    , COUNT(p.rid) AS no_allocated 
    FROM room_detail r 
    LEFT 
    JOIN allocated_user p 
    ON p.rid = r.rid 
GROUP 
    BY r.rid 
    , r.no_of_persons 

Если вы хотите, чтобы исключить строки, которые уже имеют счетчик «allocated_user», то есть не меньше, чем «no_of_persons» для комнаты, вы можете добавить предложения HAVING ...

HAVING r.no_of_persons > COUNT(p.rid) 

Что касается заказа этого результата, вы можете добавить предложение ORDER BY. Для того, чтобы получить «полный» номер первым, с наибольшим «no_of_persons»

ORDER 
    BY r.no_of_persons - COUNT(p.rid) ASC 
    , r.no_of_persons DESC 

или, как говорит ваш вопрос, если вы хотите, чтобы эти строки заказанных в псевдослучайной моде, вы могли бы сделать (неэффективное) использование функция RAND() ...

ORDER 
    BY RAND() 

(Это может быть неэффективным, так как функция RAND() должна быть оценена для каждой строки возвращается, а затем все строки должны быть отсортированы по значению, возвращаемому этой функции .

Если вы хотите получить только однострочный возврат ed, вы можете добавить предложение LIMIT ...

LIMIT 1