Как обновить самую старую запись, используя поле даты и времени? - PullRequest
0 голосов
/ 27 июня 2018

Хорошо, у меня есть этот список ожидания с уже зарегистрированными людьми, и у меня есть кнопка «СЛЕДУЮЩЕЕ ЧЕЛОВЕК», которая вызывает скрипт PHP с AJAX, который должен удалить самую старую запись (другими словами, следующий человек) из списка ожидания ,

Я пытаюсь создать этот запрос, который обновляет только самого старого человека в таблице, который еще не посещался. Вот мой запрос:

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 голосов
/ 28 июня 2018

Прежде всего: может ли быть несколько записей с одной и той же датой? Затем вы должны использовать свой идентификатор:

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 запрещает запрашивать обновленную таблицу напрямую по неизвестным причинам.

0 голосов
/ 27 июня 2018

Проблема в вашем предложении WHERE. Вы сравниваете VISIT_DATE со всей строкой таблицы.

Как отметил @ Хадсон, вы также упускаете таблицу, из которой вы получаете самое старое свидание. Поэтому ваш запрос должен выглядеть примерно так:

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)

Взгляд на: Таблица указана дважды, как в качестве цели для 'ОБНОВЛЕНИЕ', так и в качестве отдельного источника данных в mysql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...