如何使用日期时间字段仅更新最旧的记录?



好的,所以我有这个已经注册的人的等待名单,我有一个"下一个人"按钮,它调用带有AJAX的PHP脚本,该脚本应该从等待列表中删除最旧的记录(换句话说,下一个人(。

好吧,我正在尝试构建此查询,该查询仅更新表中尚未参加的最年长的人。这是我的查询:

UPDATE queue
SET ATTENDED='1' 
WHERE VISIT_DATE = (SELECT * WHERE ATTENDED='0' ORDER BY VISIT_DATE ASC LIMIT 1)

这是我的表(队列(:

ID      int(11)
GUEST_NAME  varchar(50)
VISIT_DATE  datetime(6)
ATTENDED    int(11)

问题是我收到错误">MySQL 错误 1241:操作数应包含 1 列"。

我做错了?

问题出在您的WHERE子句中。您正在将VISIT_DATE与表的整行进行比较。

正如@Hudson所指出的,您还缺少从中获得最早日期的表格。因此,您的查询应如下所示:

UPDATE 
queue AS UpdateTbl
SET 
UpdateTbl.ATTENDED='1' 
WHERE 
UpdateTbl.VISIT_DATE = (SELECT 
ReadTbl.VISIT_DATE 
FROM
(select * from queue) AS ReadTbl
WHERE 
ReadTbl.ATTENDED='0' 
ORDER BY 
ReadTbl.VISIT_DATE ASC 
LIMIT 1)

查看:表被指定了两次,既作为"UPDATE"的目标,也作为mysql中数据的单独来源

首先:可以有多个具有相同日期的记录吗?然后,您必须使用您的ID:

UPDATE queue
SET attended = 1
WHERE id = 
(
SELECT id 
WHERE attended = 0
FROM (SELECT * FROM queue) q
ORDER BY visit_date, id
LIMIT 1
);

否则,它只是最短日期:

UPDATE queue
SET attended = 1
WHERE visit_date = 
(
SELECT MIN(visit_date)
FROM (SELECT * FROM queue) q
WHERE attended = 0
);

在这两种情况下,我们都必须选择FROM (SELECT * FROM queue) q而不仅仅是FROM queue,因为 MySQL 禁止出于未知原因直接查询更新后的表。

最新更新