我觉得这个名字page_last模棱两可(它是指上一页吗?还是访问时的最后一页?)。建议你改成page_prev.
假设没有人在一次访问中多次访问同一页面,则以下内容接近于填写:
select h.*, hprev.page_url as page_prev
from hits h left outer join
     hits hprev
     on hprev.page_next = h.page_url and hprev.visit_id = h.visit_id
如果这不是真的,那么您需要最新的。您可以使用相关子查询来获得它:
select h.*,
       (select h2.page_url
        from hits h2
        where h2.visit_id = h.visit_id and h2.page_next = h.page_url and
              h2.timestamp < h.timestamp
        order by timestamp desc
        limit 1
       ) as page_prev
from hits h
在 MySQL 中进行更新有点棘手,因为您无法在更新中直接使用更新后的表。但是,以下技巧应该有效:
update hits
    set page_prev = (select page_url
                     from (select page_url
                           from hits h2
                           where h2.visit_id = hits.visit_id and
                                 h2.page_next = hits.page_url and
                                 h2.timestamp < hits.timestamp
                           order by timestamp desc
                           limit 1
                          ) h3
                    )
这个技巧之所以奏效,是因为 MySQL 实现了视图,因此它实际上创建了一个“临时表”,其中包含更新所需的信息。