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