2013-04-12 84 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'只是一個我已經給出的名字,但你可以用你想要的任何東西來改變它。在附註中,記得在你運行任何更新/刪除語句之前備份數據庫。 –