Как я могу объединить таблицы и получить самую последнюю строку - PullRequest
0 голосов
/ 19 марта 2019

Я бы хотел отследить движение гостей, которые останавливаются в отеле (гипотетически).Таким образом, я могу создать 3 таблицы.

  1. гости = люди, которые останавливаются в отеле
  2. room_guest_is_in = где видели гостя
  3. комнаты = конкретная информация ономер

гости

guest_id | name
1        | Bob
2        | Mike

номера

room_id | room_name
1       | Casino
2       | Resturant
3       | Spa

room_guest_is_in

guest_id is a foreign key from the guests table.
last updated is the last time we recorded them in the room.
room_id is a foreign key from the room table

rguest_id | guest_id | roomd_id | last_updated
1         | 1        | 3        | 2019-03-18 10:04:16
2         | 1        | 3        | 2019-03-18 11:19:34
3         | 1        | 2        | 2019-03-18 12:11:36
4         | 2        | 1        | 2019-03-18 12:03:20

Из приведенных выше данных вы можетесм. Боб был в Спа дважды в 2019-03-17 10:04:16 и 2019-03-17 11:19:34 и в ресторане один раз.

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

Я хочу, чтобы результаты были похожи на:

guest_id | name | room_name  | last updated
1        | Bob  | Spa        | 2019-03-17 11:19:34
1        | Bob  | Gym        | 2019-03-17 12:11:36

Я получаю результаты вроде:

guest_id | name | room_name  | last updated
1        | Bob  | Spa        | 2019-03-17 11:19:34
1        | Bob  | Gym        | 2019-03-17 12:11:36
1        | Bob  | Spa        | 2019-03-17 10:04:16

Мой SQL:

SELECT guests.guest_id, guests.name, rooms.room_name, room_guest_is_in.last_updated
FROM guests
INNER JOIN room_guest_is_in ON guests.guest_id = room_guest_is_in.guest_id
INNER JOIN rooms.room_id ON room_guest_is_in.room_id = rooms.room_id
WHERE guests.guest_id = 1
ORDER BY room_guest_is_in.last_updated DESC

Ответы [ 3 ]

1 голос
/ 19 марта 2019

В основном вам просто нужно GROUP BY, чтобы получить максимальную дату:

SELECT guests.guest_id, guests.name, rooms.room_name, MAX(room_guest_is_in.last_updated) AS last_updated
FROM guests
INNER JOIN room_guest_is_in ON guests.guest_id = room_guest_is_in.guest_id
INNER JOIN rooms.room_id ON room_guest_is_in.room_id = rooms.room_id
WHERE guests.guest_id = 1
GROUP BY guests.guest_id, guests.name, rooms.room_name;
0 голосов
/ 19 марта 2019

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

SELECT top 1 guests.guest_id, guests.name, rooms.room_name, room_guest_is_in.last_updated
FROM guests
INNER JOIN room_guest_is_in ON guests.guest_id = room_guest_is_in.guest_id
INNER JOIN rooms.room_id ON room_guest_is_in.room_id = rooms.room_id
WHERE guests.guest_id = 1
ORDER BY room_guest_is_in.last_updated DESC
0 голосов
/ 19 марта 2019

Использовать коррелированный подзапрос

SELECT a.guest_id, a.name, c.room_name, b.last_updated
FROM guests a
INNER JOIN room_guest_is_in b ON a.guest_id = b.guest_id
INNER JOIN rooms c ON b.room_id = b.room_id
   WHERE a.guest_id = 1 and 
   b.last_updated in 
      (select max(b1.last_updated)
          from room_guest_is_in b1 where b.room_id=b1.room_id and 
          b1.guest_id=b.guest_id)
ORDER BY b.last_updated DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...