テーブルから 20 行を選択し、ループして、目的のスコア範囲にある同じテーブルから単一の行を取得するクエリがあります。見つかった行は、再度選択されないように削除されます。
user_id は一意であり、col1=0 を持つ行と col1=1 を持つ行があるため、2 番目のクエリは最初のクエリから行を選択することはありません。
一時テーブルは次のようになります。
user_id col1
-------------------
1 0
2 0
3 1
4 1
ユーザーテーブルは次のようになります。
user_id score
-----------------
1 1000
2 2000
3 3000
4 4000
$res = do_query("SELECT temp.user_id,user.score
FROM temp,user
WHERE temp.col1=0 AND temp.user_id=user.user_id LIMIT 20");
while (($row = mysql_fetch_row($res))) {
$score = $row[1];
$alt_res = do_query("SELECT temp.user_id, user.score
FROM temp,user
WHERE temp.col1=1 AND temp.user_id=user.user_id
AND user.score<$score AND user.score>$score*0.66 LIMIT 1");
$alt_row = mysql_fetch_row($alt_res)
$user_id = $alt_row[0];
do_query("DELETE FROM temp WHERE user_id=$user_id");
}
これは問題なく機能しますが、これを単一のクエリに変換しようとしましたが、重複した値を取得し続けており、それらを取り除くことができないようです。
SELECT temp.user_id,t1.user_id,t1.score FROM (
SELECT temp.user_id,user.score
FROM temp,user
WHERE temp.col1=0 AND temp.user_id=user.user_id LIMIT 20) AS t1,temp,user
WHERE temp.col1=1 AND temp.user_id=user.user_id
AND t1.score<user.score AND t1.score>user.score*0.66 GROUP BY temp.user_id
temp.user_id が一意である 20 行を取得しますが、t1.user_id と重複しています。
例えば:
temp.user_id t1.user_id
----------------------------
1 6
2 7
3 7
4 7
5 8
そして私が欲しい:
temp.user_id t1.user_id
-----------------------------
1 6
2 7
3 8
4 9
5 10
どちらの列でも user_id が繰り返されないようにする方法はありますか?