Удаление нескольких записей из mysql на основе уникального идентификатора и неуникального идентификатора

Я новичок в MySQL, и у меня возникли проблемы с преобразованием оператора SQL, и мне нужна помощь, если это вообще возможно.

Суть в том, что мне нужно иметь возможность удалять элементы из одной таблицы на основе даты последнего входа в систему, к сожалению, я не контролирую дизайн таблицы (который ошибочен) и должен сравнивать идентификатор персонажа с символом UID и датой LastLogin, чтобы для удаления элементов из другой таблицы, которая отслеживает объекты только по charcaterID (неуникальному).

Вот что у меня есть до сих пор

DELETE FROM object_data WHERE CharacterID IN (
    SELECT CharacterID FROM object_data 
    WHERE CharacterID IN (
        SELECT CharacterID FROM character_data
            WHERE LastLogin < DATE_SUB(NOW(), INTERVAL 30 DAY)
            AND PlayerUID NOT IN (
                SELECT PlayerUID FROM character_data 
                    WHERE LastLogin > DATE_SUB(NOW(), INTERVAL 30 DAY))))

Я получаю сообщение об ошибке 1093. Вы не можете указать целевую таблицу «object_date» из обновления в предложении FROM.

Любые идеи?


person wheaticusRex    schedule 01.11.2013    source источник


Ответы (2)


Иногда SQL barfs, если вы не называете имя таблицы подзапроса

DELETE FROM object_data 
WHERE CharacterID IN 
(
  SELECT CharacterID 
  FROM object_data 
  WHERE CharacterID IN 
  (
    SELECT CharacterID 
    FROM character_data
    WHERE LastLogin < DATE_SUB(NOW(), INTERVAL 30 DAY)
    AND PlayerUID NOT IN 
    (
       SELECT PlayerUID 
       FROM character_data 
       WHERE LastLogin > DATE_SUB(NOW(), INTERVAL 30 DAY)  
    ) AS t1
  ) AS t2
) AS t3
person Hogan    schedule 01.11.2013

Попробуй это сейчас:

DELETE FROM object_data WHERE CharacterID IN (
    SELECT CharacterID FROM  (
        SELECT CharacterID FROM character_data
            WHERE LastLogin < DATE_SUB(NOW(), INTERVAL 30 DAY)
            AND PlayerUID NOT IN (
                SELECT PlayerUID FROM character_data 
                    WHERE LastLogin > DATE_SUB(NOW(), INTERVAL 30 DAY)))y)
person Mihai    schedule 01.11.2013