使用数据库MySQL中的值填充新列

使用数据库MySQL中的值填充新列,mysql,Mysql,我有一个MySQL查询,其中我获取了一个按desc date排序的用户访问列表 SELECT `id`, `name`, `date` FROM `logs` WHERE `iid` = ? ORDER BY `date` DESC'; 每个日志都有iid、id、name、date,生成的数组中每行都有3个请求的值 下面是数据库的一个示例: | iid | id | name | date | ----------------------------

我有一个MySQL查询,其中我获取了一个按desc date排序的用户访问列表

SELECT `id`, `name`, `date` 
FROM `logs` 
WHERE `iid` = ? 
ORDER BY `date` DESC';
每个日志都有
iid、id、name、date
,生成的数组中每行都有3个请求的值

下面是数据库的一个示例:

| iid   | id    | name  | date              |
---------------------------------------------
| 1     | 1     | foo   | 2013-09-13 10:14  |
| 2     | 1     | foo   | 2013-09-12 08:10  |
| 2     | 1     | foo   | 2013-09-11 14:43  |
| 1     | 1     | foo   | 2013-09-10 15:12  |
iid
是页面,
id
是用户id

现在我需要添加第四列,名为
lastvisit
,它应该包含每个
iid上每个用户上次访问的日期
因此,对于两个
iid
,我应该有两个不同的
lastvisit
值:

| iid   | id    | name  | date              | lastvisit         |
-----------------------------------------------------------------
| 1     | 1     | foo   | 2013-09-13 10:14  | 2013-09-12 15:12  |
| 2     | 1     | foo   | 2013-09-12 08:10  | 2013-09-11 14:43  |
| 2     | 1     | foo   | 2013-09-11 14:43  | null              |
| 1     | 1     | foo   | 2013-09-10 15:12  | null              |
我会将此列添加到数据库中,每次访问时,我都会检查最近的访问,以获取要放入新条目的
lastvisit

我的问题是关于已经记录的条目,它们没有
lastvisit
的值

我需要用查询填充它们,例如:

UPDATE `logs`
SET `lastvisit` = (
    SELECT `date`
    FROM `logs` 
    WHERE `id` = ? AND 'iid' = ?
    ORDER BY `date` DESC'
    LIMIT 0, 1;
)

显然,此查询不起作用,是否可以为每个条目编写一个查询来执行此任务?

您已经非常接近了。您需要一个相关子查询来将内部查询连接到正在更新的外部表。我认为这会奏效:

UPDATE `logs` l
    SET `lastvisit` = (
        SELECT `date`
        FROM `logs` l2
        WHERE l2.id = l.id AND l2.iid = l.iid AND l2.date <= l.date
        ORDER BY `date` DESC'
        LIMIT 0, 1;
    );

谢谢,当我有权访问数据库时,我会尝试,但是你能解释一下它是如何工作的吗?什么是
l
l2
等等?它告诉我们:
每个派生表都必须有自己的别名
,顺便说一下
prevdate
应该是
lastvisit
?这两个问题都已解决。事实上,应该是
l.date
l.lastVisite
。谢谢,没有错误,但是现在整个列都填充了一个日期,所有条目的日期都一样。。。(日期是当前时间)@FezVrasta。答案中有两个拼写错误,但我不认为它们会导致这个问题。子查询是否返回正确的上一个日期。不要介意。我认为问题在于
@iid
被设置为
id
,而不是
iid
update logs l join
       (select l.*,
               if(@id = id and @iid = iid, @date, NULL) as prevdate,
               @id := id, @iid := iid, @date := date
        from logs l cross join
             (select @date := '', @id := '', @iid := '') const
        order by id, iid, date
       ) lprev
       on l.id = lprev.id and l.iid = lprev.iid and l.date = lprev.date
    set l.lastvisit = lprev.prevdate;