好的,所以我有这个已经注册的人的等待名单,我有一个"下一个人"按钮,它调用带有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 禁止出于未知原因直接查询更新后的表。