2013-04-12 4 views
0

У меня есть поворот на этот популярный вопрос и принятый ответ: How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?Удалить все строки, которые не содержат максимальное значение в группе

Я таблица структурированную так же, но вместо выбора строки с наибольшим datatime I 'd УДАЛИТЬ все строки в каждой группе идентификаторов, которые не содержат максимальное время datetime. Запрос должен сделать таблицу меньшей по строкам.

Я попытался с помощью запроса на выборку принято отвечать в в ГДЕ НЕ СУЩЕСТВУЕТ суб запроса, но я получаю сообщение об ошибке «Вы не можете указать целевую таблицу ... для обновления в предложении FROM»

Как бы вы изменить это, чтобы удалить строки, которые не отвечают требованиям ВЫБЕРИТЕ здесь:

SELECT tt.* 
FROM topten tt 
INNER JOIN 
    (
    SELECT home, MAX(datetime) AS MaxDateTime 
    FROM topten 
    GROUP BY home 
    ) groupedtt ON tt.home = groupedtt.home AND tt.datetime = groupedtt.MaxDateTime 

ответ

0

с id быть рК topten:

delete 
     from topten tt1 
    where tt1.id NOT IN (
       SELECT tt2.id 
        FROM topten tt2 
      INNER JOIN (
          SELECT home, MAX(datetime) AS MaxDateTime 
          FROM topten tt3 
          GROUP BY home 
         ) groupedtt ON tt2.home = groupedtt.home AND tt2.datetime = groupedtt.MaxDateTime 
      ) 
     ; 
+0

Привет, но получаю сообщение об ошибке: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'tt1, где tt1.id NOT IN (SELECT tt2.id' в строке 2 –

1

С идентификатором, являющимся основным ключом вашей таблицы

;with 
GetResults 
AS 
(
    SELECT tt.* 
    FROM topten tt 
    INNER JOIN 
     (
     SELECT home, MAX(datetime) AS MaxDateTime 
     FROM topten 
     GROUP BY home 
     ) groupedtt ON tt.home = groupedtt.home AND tt.datetime = groupedtt.MaxDateTime 
) 
    DELETE GetResults 
    FROM topten tt LEFT JOIN GetResults ON tt.ID = GetResults.ID 
    WHERE GetResults.ID IS NULL 
+0

Прошу простить мое незнание SQL, но это '; с частью GetResults' SQL-запрос? Если это что-то значит, я хотел бы иметь возможность вводить этот SQL-код в диалог Run Query в phpMyAdmin для очистки большой таблицы. –

+0

'; with' означает, что вы используете выражение Common Table (вы можете проверить онлайн для SQL CTE). «GetResults» - это просто имя, которое я ему дал, но вы можете изменить его на все, что хотите. На стороне заметьте, всегда помните о резервном копировании своей БД перед любыми операциями обновления/удаления, которые вы запускаете. –