使用数据库MySQL中的值填充新列
我有一个MySQL查询,其中我获取了一个按desc date排序的用户访问列表使用数据库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 | ----------------------------
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;