用连接替换子查询

时间:2016-10-22 19:45:04

标签: mysql sql

我有两张桌子

单位

   id - primary key
   title - text

flats_reservations

   id - primary key
   flat_id - foreign key to Flats(id)
   creator_id - foreign key to users(id)
   is_reserved - boolean
   created_at - current_timestamp

如果flats_reservations有这些行

id=1, flat_id=12, creator_id=5, is_reserved=1, created_at=2016-10-10 00:00:00
id=2, flat_id=12, creator_id=5, is_reserved=0, created_at=2016-10-10 00:00:05
id=3, flat_id=12, creator_id=4, is_reserved=1, created_at=2016-10-10 00:00:10

然后 id = 4的用户可以删除预订(例如插入以下行( is_reserved = 0

id=4, flat_id=12, creator_id=4, is_reserved=0, created_at=2016-10-10 00:00:10

没有其他用户可以做到这一点。

如何选择目前(例如最新)预订状态的所有单位清单?

简单但不有效的方式 - 适用于每个单位

select is_reserved from flat_reservations where flat_id={id} order by created_at desc limit 1

这也可以通过子查询来完成

select flats.id, flats.title, (select is_reserved from flat_reservations where flat_id=flats.id order by created_at desc limit 1) as is_reserved from flats;

但我怎样才能使这更有效呢?

1 个答案:

答案 0 :(得分:1)

这基本上是您的查询:

select f.id, f.title,
       (select is_reserved
        from flat_reservations fr
        where fr.flat_id = f.id
        order by fr.created_at desc
        limit 1
       ) as is_reserved
from flats f;

这是做你想做的事情的好方法。如果性能问题,您需要flat_reservations(flat_id, created_at, is_reserved)上的索引。