2017-07-27 20 views
0

我想刪除用戶標識組中的每一行,關鍵字xyz,除了價格最高的一個。MySQL刪除組中的一切與指定的關鍵字,但最大

我試過很多片段,它仍然不起作用。

我想:

DELETE FROM 
    `table` t1 
WHERE 
    `keyword` = 'xyz' AND 
    `price` <> (
    SELECT 
     MAX(`price`) 
    FROM (
     SELECT 
     * 
     FROM 
     `table` t2 
     WHERE 
     `keyword` = 'xyz' AND 
     t2.user = user 
    ) t3 
) 

但它也選擇了一個具有最高的性價比,它也只選擇應該將其刪除

這一個行的一小部分......

DELETE FROM 
    `table` AS zt 
WHERE 
    `keyword` = 'xyz' AND 
    EXISTS (
    SELECT 
     * 
    FROM 
     `table` ex 
    WHERE 
     ex.user = zt.user AND 
     ex.price > zt.price 
); 

給我以下錯誤:

未知的表字段zt.user在where子句中。如果我添加INNER JOIN它說未知的關鍵字。

回答

1

在MySQL中,而在依賴內部查詢使用table x你不能從table x刪除,即使你給他們不同的別名。

你的內部查詢依賴,因爲你用zt或在第一個例子中的外部查詢的user非別名訪問。

最簡單的選項是2個查詢:首先,獲取要刪除的ID,然後刪除它們。 (實現取決於您的編程語言)

只有一個查詢只有在您使用連接時纔有可能。

更新:根本不可能進行所有類型的內部查詢(沒有連接或沒有多個查詢)。

更新二:有其他查詢嵌套內部查詢的選項,同時設置derived_merge=off - 但這是非常醜陋的,去參加。

0

什麼嘗試像

DELETE FROM `table` WHERE `keyword` = 'xyz' AND `price` NOT IN (SELECT MAX(`price`) FROM table) 

這是非常粗魯,但應該工作

1

使用一個子查詢JOIN:

DELETE t1 
FROM `table` t1 
JOIN (
    SELECT user, max(price) as price 
    FROM `table` 
    GROUP BY user 
) t2 ON t2.user = t1.user 
    AND t2.price <> t1.price 
WHERE t1.keyword = 'xyz' 

這有可能是你的子查詢需要WHERE keyword = 'xyz'。這取決於你的邏輯。

+0

謝謝你的時間!奇蹟般有效。 – Dawg

0
DELETE FROM `table` WHERE `keyword` = 'xyz' AND `primarykey` != 
(SELECT `primarykey` FROM `table` WHERE `price` = (SELECT MAX(`price`) FROM 
`table`) LIMIT 1);