如何合并表格并获取最新行

时间:2019-03-19 10:24:11

标签: mysql sql database mysqli

我想追踪那些住在酒店的客人的活动情况(假设)。这样,我可以创建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:162019-03-17 11:19:34分别在水疗中心和餐厅一次。

我的问题:我想选择bob曾经进入过的所有房间。但是,如果Bob曾经在一个房间中不止一次,则应该只显示该房间的最新条目。这意味着一个房间在select语句中不会出现超过一次

想要结果如下:

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 个答案:

答案 0 :(得分:1)

基本上,您只需要class StatisticsSerializer(serializers.ModelSerializer): # Using nest serializer for handling get and post # Using serializers instead of the model fields url = serializers.HyperlinkedIdentityField(view_name='statistics-detail') flight = FlightStatisticsSerializer(allow_null=True) delay_count = DelayCountStatisticsSerializer(allow_null=True) delay_time = DelayTimeStatisticsSerializer(allow_null=True) class Meta: model = models.Statistics fields = ('url','airport', 'carrier', 'month', 'year', 'flight', 'delay_time', 'delay_count') def create(self, validated_data): flight_statistics = models.FlightStatistics.objects.create( **(validated_data.pop('flight'))) delay_time_statistics = models.DelayTimeStatistics.objects.create( **(validated_data.pop('delay_time'))) delay_count_statistics = models.DelayCountStatistics.objects.create( **(validated_data.pop('delay_count'))) print(flight_statistics) statistics = models.Statistics.objects.create(**validated_data, flight=flight_statistics, delay_time=delay_time_statistics, delay_count=delay_count_statistics) return statistics def update(self, instance, validated_data): flight, _ = models.FlightStatistics.objects.update_or_create(id=instance.flight.id, defaults=validated_data.pop('flight')) delay_time, _ = models.DelayTimeStatistics.objects.update_or_create(id=instance.delay_time.id, defaults=validated_data.pop('delay_time')) delay_count, _ = models.DelayCountStatistics.objects.update_or_create(id=instance.delay_count.id, defaults=validated_data.pop('delay_count')) new_instance, _ = models.Statistics.objects.update_or_create(id=instance.id, defaults=validated_data) return new_instance 即可获得最长日期:

GROUP BY

答案 1 :(得分:0)

使用相关子查询

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

答案 2 :(得分:0)

如果您的代码给出了您上面编写的结果,我认为这将提供预期的结果..如果您还需要其他内容,您可以询问..

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