2011-07-19 5 views
1

私はスコアと日付のリストを格納する高得点テーブルを持っています。私は一ヶ月以上前にトップ10に入っていないすべての得点を見つけたいと思います。 トップ10にない古い行を見つけてMySQLを使用して削除する方法

はヶ月前に少なくとも提出されたすべての項目を見る見つけ、 のトップ10にそれらの古いではありません:それは何

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

を:私は、私が欲しいものの一部である次のクエリを持っています得点はです。

私はそれが何をしたい:

すると、すべてのスコアヶ月前に少なくとも提出されたすべての項目を見る見つけ、 のトップ10に含まれていない

簡単なことですか?

編集:私が使用しているMySQLのバージョンでは、サブクエリがLIMITに対応していません。私はそれをしようとすると、私は、次のエラーが表示さ:

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

編集を2:私はそれが簡単なことと考えましたので、私は実際に私は、SELECT文を使用した、テーブルからこれらのスコアを削除したいのですが選択を削除に変換するには、サブクエリに慣れていないし、同じテーブルに参加してそこから削除することもできません。

+0

ホストは一時テーブルをサポートしていますか?あなたは、新しいテンポラリテーブルにハイスコアを選択することができます。 – Zoredache

+0

@Ed以下の編集を参照してください.LIMITの制限を解決します:) – 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) 

EDIT:

あなたが正しいです。 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 

EDIT#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ステートメントに変換するのは簡単だと思ったので、元の質問には含めませんでしたが、どうすればいいですか?それをdelete文にしますか?それにもかかわらず、それは私の元の質問に答えたので、私はあなたの答えを受け入れることはありません。 –

1

がそれを分割します。

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) 

SELECT id FROM entries ORDER BY score DESC LIMIT 10 

が次にあなたに月より古いすべてのものを与えてクエリを記述します。まず、あなたのトップ10のエントリを取得するクエリを作成します

これはすべきことです。

関連する問題