SQL вставить запрос с некоторым условием - PullRequest
1 голос
/ 02 мая 2020

Я использую MySQL.

Представлены три таблицы: Пациент, Заняты, Комната и Привилегированный пациент. Мне нужно идентифицировать первую доступную комнату и выделить комнату для вновь принятого пациента с PIN-кодом «314» (пациент уже добавлен в базу данных). Обратите внимание, что в комнате должно быть одно или несколько человек, в зависимости от того, является ли пациент частным или нет.

  • В результате я хочу получить запрос SQL, который назначит пациенту PIN-код 314 в комнату номер 1. Поскольку этот пациент не является частным пациентом, а комната № 1 является первой комнатой с пустой кроватью (размер составляет 2 кровати).

Любая идея как идентифицировать эту комнату? Могу ли я сделать это с помощью условной INSERT?

Table Patient

+-------+---------+
| PIN   |  name   |
+-------+---------+
|314    |  Lana   |
|778899 | Michael |
|345566 |  Jone   |
+-------+---------+

Занятость таблицы


+--------+--------+
|patient |  room  |
+--------+--------+
|778899  |    1   |
|345566  |    4   |
+-------+---------+

Столовая

+--------+--------+
|number  |  size  |
+--------+--------+
|  1     |    2   |
|  2     |    12  |
|  3     |    1   |
|  4     |    1   |
+-------+---------+

Private_Patient

+--------+--------+
|patient |consultant|
+--------+--------+
|345566  |  345566  |

+-------+---------+

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Рассмотрим:

insert into occupies(patient, room)
select 314, r.number
from room r
left join (select room, count(*) size from occupies group by room) o
    on o.room = r.number
where coalesce(o.size, 0) < r.size
order by r.number
limit 1

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

Может быть проще понять с помощью коррелированного подзапроса:

insert into occupies(patient, room)
select 314, r.number
from room r
where r.size > (
    select count(*)
    from occupies o
    where o.room = r.number
)
order by r.number
limit 1
0 голосов
/ 02 мая 2020
INSERT INTO Occupies(room, patient) 
    SELECT number, '314'
        FROM Room r
        INNER JOIN 
             (SELECT room, COUNT(patient) amountOfPatientsInRoom from Occupies GROUP BY 
                room) ON 
                    o.room = r.number
        WHERE r.size < o.amountOfPatientsInRoom
        LIMIT 1
...