此问题与MySQL有关:
我需要自行联接表以获得每个组中的最后一条记录,并将该记录与另一个表联接。
假设,
comments
表有4列pkid
,session_id
,comment
,create_date
(pkid
是主键,并且会有很多注释每个session_id
)
comment_channel
表具有session_id
,channel
(每个session_id
仅一行)
现在我需要获取每个comment
及其session_id
中的最后一个channel
所以我可以写一个类似这样的查询:
SELECT t1.session_id, t1.comment, t3.channel, t1.create_date
FROM comments t1
join (
SELECT max(pkid)
FROM comments
GROUP BY session_id
) t2 on t1.pkid = t2.pkid
left join comment_channel t3 on t1.session_id = t3.session_id
如果我想将此视图编写为视图,则不能输入相同的查询,因为MySQL不支持VIEW中的子查询。
所以我必须写两个视图:
查看1:
CREATE OR REPLACE VIEW comment_channel_view AS
SELECT t1.session_id, t1.comment, t3.channel, t1.create_date FROM comments t1
join comment_max_id_view t2 on t1.pkid = t2.pkid
left join comment_channel t3 on t1.session_id = t3.session_id
查看2:
CREATE OR REPLACE VIEW comment_max_id_view AS
SELECT max(pkid)
FROM comments
GROUP BY session_id
问题出在这里,如果我使用此视图选择特定时期
例如
SELECT * FROM comment_channel_view
WHERE create_date between '2019-04-05' and '2019-04-10'
然后comment_max_id_view
进行全表扫描,而不仅仅是选定的日期范围,这需要5分钟以上的时间才能得到结果。如果我将日期范围条件放在子查询中,那么我得到的结果只是毫秒。
为避免在comment_max_id_view
中进行全表扫描,我该怎么办?