2017-07-06 51 views
0

我有我正在嘗試截斷的pages表。 我需要留下每個頁面的最後10個版本(頁面由uid標識)。子查詢中WHERE子句中的未知列

id----|----uid----|----version 

1 ----|---- 1 ----|---- 1 

2 ----|---- 1 ----|---- 2 

3 ----|---- 1 ----|---- 3 

4 ----|---- 1 ----|---- 4 

5 ----|---- 2 ----|---- 1 

6 ----|---- 2 ----|---- 2 

........... 

55 ----|---- 1 ----|---- 23 

56 ----|---- 2 ----|---- 14 

57 ----|---- 2 ----|---- 15 

我試過這個MySQL查詢:

DELETE FROM pages AS p WHERE p.id IN (
    SELECT Versions.id FROM 
     (SELECT q.id FROM pages AS q WHERE p.uid = q.uid ORDER BY q.version DESC LIMIT 10) 
    AS Versions 
) 

但上面的SQL回報:

未知列 'p.uid' 在 'where子句'

關於Stackoverflow是像我的類似問題的答案的負載,但因爲我不是SQL忍者我無法合作打破這些以適應我的問題。 我不想過度殺死我的查詢。 必須有一些簡單的答案。

我可以實現MSSQL服務器需要截斷,下面的查詢:

DELETE FROM pages WHERE id NOT IN (
    SELECT Versions.id FROM 
     (SELECT TOP (10) q.id FROM pages AS q WHERE pages.uid = q.uid ORDER BY q.version DESC) 
    AS Versions 
) 

感謝

+1

你有沒有P別名在你的內心查詢 - 通過刪除也是爲什麼訂單? –

+0

對不起,我已經從我用來測試的select查詢轉換了這個,因爲我不想刪除我的開發環境中的行。我現在改變了這個 –

回答

1

你並不需要統籌查詢在這裏彙集;只需選擇ID列表,以刪除 - 該表是相同的

DELETE FROM pages WHERE id NOT IN 

    (SELECT TOP (10) id FROM pages ORDER BY q.version DESC) 

你不能「爲了通過」刪除查詢..

如果youre後的MySQL版本,和你的MySQL版本犯規子查詢的支持限制,它不支持這樣的窗函數:

delete from pages where id in 
    (select id from 
    (select id, row_number() over(order by dt desc) as rown from pages) a where a.rown > 10) 
) 

,那麼你可以考慮這樣的:

CREATE table x as SELECT * FROM pages ORDER BY q.Version DESC LIMIT 10 

TRUNCATE /*or delete from*/ pages 

INSERT INTO pages SELECT * FROM x 
1
DELETE PG FROM pages PG 
LEFT JOIN 
(
    SELECT q.id FROM pages AS q ORDER BY q.version DESC LIMIT 10 OFFSET 0 
) Versions ON Versions.ID=PG.ID 
WHERE Versions.ID IS NULL 

您可以嘗試以上查詢。

希望這會幫助你。

+0

這不是我要找的。請參閱示例表格數據。謝謝 –

+0

@MariuszSołtys你想刪除'TOP 10'頁面嗎? –

+0

我想刪除所有頁面版本除了每個頁面的最後10版本,這就是爲什麼我需要引用'uid'(請參閱MSSQL示例) –

0
DELETE p FROM pages AS p WHERE p.id IN (
    SELECT Versions.id FROM 
     (SELECT q.id FROM pages AS q WHERE p.uid = q.uid ORDER BY q.version DESC LIMIT 10) 
    AS Versions 
) 

檢查,如果這個工程..

+0

'where子句'中的未知列'p.uid' –