2013-04-12 54 views
0

最大值的所有行我有一个扭转这一流行的问题,接受的答案:How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?删除不包含在

我有一个表类似的结构,而不是最高DATATIME我选择了行,但要删除每个ID分组中不包含最大日期时间的所有行。查询应该使行在表格中更小。

我已经使用在WHERE NOT EXISTS子查询公认的答案的选择查询尝试,但我得到的错误“您不能指定目标表... FOR UPDATE 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的PK:

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 where tt1.id NOT IN'(在第2行选择tt2.id“)使用正确的语法。 –

1

以ID为表格的主键

;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语句?如果这意味着什么,我希望能够在phpMyAdmin的Run Query对话框中输入这个SQL来清理一个大表。 –

+0

'; with'表示您正在使用公用表表达式(您可以检查在线的SQL CTE)'GetResults'只是一个我已经给出的名字,但你可以用你想要的任何东西来改变它。在附注中,记得在你运行任何更新/删除语句之前备份数据库。 –