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

时间:2018-06-27 16:12:45

标签: php sql mysqli

好吧,所以我有这个等待名单中已经注册的人,并且我有一个“ NEXT PERSON”按钮,该按钮使用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列”。

我做错了吗?

2 个答案:

答案 0 :(得分: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)

查看:Table is specified twice, both as a target for 'UPDATE' and as a separate source for data in mysql

答案 1 :(得分:0)

首先:是否可以有多个具有相同日期的记录?然后,您必须使用您的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出于未知原因禁止直接查询更新的表。