2011-07-19 63 views
1

我有一個高分表,用於存儲分數和日期列表。我希望找到所有未超過一個月大的前10名的分數。我有以下查詢這部分是什麼,我想:如何查找不在前10位的舊行並使用MySQL刪除它們

SELECT userId FROM highscores 
    WHERE DATEDIFF(FROM_UNIXTIME(date), 
       DATE_SUB(CurDate(), INTERVAL 1 MONTH)) < 0 
    ORDER BY score DESC LIMIT 10,18446744073709551615 

做些什麼:

找到所有至少在一個月前提交的分數和不在的排名前10的老分數

我想它做的事:

找到所有至少在一個月前提交的分數和不在的 所有得分前10

就是這麼簡單?

編輯:我使用的MySQL版本不支持限制它的子查詢。當我嘗試它,我收到以下錯誤:

#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

編輯2:其實我想從表中刪除這些分數,我只是使用SELECT語句,因爲我想這將是簡單將select轉換爲delete,但我不太熟悉子查詢並加入同一個表並從那裏刪除。

+0

您的主機是否支持臨時表?您可以將高分選擇到新的臨時表中。 – Zoredache

+0

@Ed看到我的編輯如下,它解決了極限限制:) – Galz

+0

@Ed? DELETE查詢是否有用?它有用嗎? – Galz

回答

4

怎麼樣:

SELECT userId FROM highscores 
    WHERE DATEDIFF(FROM_UNIXTIME(date), 
       DATE_SUB(CurDate(), INTERVAL 1 MONTH)) < 0 
    AND userId NOT IN (SELECT userId FROM highscores ORDER BY score DESC LIMIT 10) 

編輯:

你是正確的。在使用IN (...)時,MySQL不允許在子查詢中使用LIMIT。 這是另一個我剛剛測試過的解決方案,應該可以工作。

SELECT h.userId 
FROM highscores h 
LEFT JOIN (SELECT userId FROM highscores ORDER BY score DESC LIMIT 10) as t 
    ON t.userId = h.userId 
WHERE DATEDIFF(FROM_UNIXTIME(date), DATE_SUB(CurDate(), INTERVAL 1 MONTH)) < 0 
    AND t.userId IS NULL 

編輯#2:

DELETE h.* 
FROM highscores h 
LEFT JOIN (SELECT userId FROM highscores ORDER BY score DESC LIMIT 10) as t 
    ON t.userId = h.userId 
WHERE DATEDIFF(FROM_UNIXTIME(date), DATE_SUB(CurDate(), INTERVAL 1 MONTH)) < 0 
    AND t.userId IS NULL 
+0

這是一個不錯的解決方案。但我試過了,顯然我的主機使用的任何版本的MySQL都不支持子查詢中的LIMIT。 –

+0

哦!這是正確的!請參閱編輯另一個解決方案.. – Galz

+0

看起來像它的伎倆,我認爲這將很容易將其轉換爲DELETE語句,所以我沒有把它包括在原始問題中,但是...我怎麼把它變成刪除語句?無論如何,如果沒有其他事情出現,我會接受你的回答,因爲它確實回答了我原來的問題。 –

1

分裂它。首先,進行查詢,讓你的前10項:

SELECT id FROM entries ORDER BY score DESC LIMIT 10 

然後編寫一個查詢,讓你的一切比一個月以上:

SELECT * FROM entries WHERE DATEDIFF(FROM_UNIXTIME(date), DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) < 0 

現在這些組合成一個:

SELECT * FROM entries WHERE DATEDIFF(FROM_UNIXTIME(date), DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) < 0 AND NOT id IN (SELECT id FROM entries ORDER BY score DESC LIMIT 10) 

這應該做的伎倆。

相關問題