2

私はMysqlクエリでかなり立ち往生しています。3列のテーブルがあります。

 user_id | person_id | score.

このテーブルは、各人の上位5つのハイスコアを格納するために使用されます。

特定の人の行が5行未満かどうかをチェックするクエリが必要です。少ない場合は、新しい行を挿入してください。ただし、行が5つある場合は、最低のスコアを新しいスコアに置き換える必要があります。

これはPHPで記述されたWebサービス用であり、新しいスコアに関するデータはparamsとしてメソッドに送信されます。

今数時間立ち往生しています—これを1つのクエリで実現することさえ可能ですか?

4

4 に答える 4

0

私はこのシナリオを提案します(私はそれを試していません、それは単なるアイデアです):

私が理解しているように、必要なIDは5つだけです。このようなサブクエリを実行できます

SELECT MAX(id) AS last_id FROM table

SELECT MIN(score), id AS lowest_id FROM table

それから

insert or replace into table (id, ...) values ( MIN(last_id+1, lowest_id),  ... )

間違いの可能性があり、サブクエリは1つしかありませんが、メインのアイデアを理解していただければ幸いです。

于 2012-08-13T09:27:50.457 に答える
0

最低スコアを識別する一意のキーがあれば、可能かもしれません。次に、INSERT ... ON DUPLICATE KEY コンストラクトを使用できます。ただし、最低スコアを明示的に追跡するトリガーをインストールする必要があります。

于 2012-08-13T09:25:39.813 に答える
0

mysql でストアド プロシージャを使用できます。テーブルの名前はわかりませんが、よく見ると仕組みがわかります。

DELIMITER $$
DROP PROCEDURE IF EXISTS test $$
CREATE PROCEDURE test( IN testparam VARCHAR(22) )
BEGIN
 DECLARE count INT(11);
 SET count = (SELECT COUNT(*) FROM persons );
 IF count < 5 THEN
  insert into table_needed_for_insert values(testparam);
 ELSE
  update table_needed_for_insert where score=(select min(score) from table_needed_for_insert);
 END IF;

 select * from table_needed_for_insert
END $$
DELIMITER;

そして、このことを実行する方法 CALL test(1); 1 はパラメーターで、必要な数だけ作成できます。そしてphpから次のように直接呼び出すことができます

$result = mysql_query("call test(".$param.")");

また、ここで mysql ストアド プロシージャのチュートリアルを確認できます: http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx

于 2012-08-13T09:29:54.383 に答える
0

最も簡単な方法は、データを挿入することです。

INSERT INTO top_scores (user_id, person_id, score_id) VALUES (1,2,3)

次に、不適切な行を削除します

DELETE top_scores FROM top_scores
INNER JOIN 
(SELECT * FROM top_scores WHERE person_id = 2 ORDER BY score ASC LIMIT 5, 1000000) AS inappropriate_rows 
USING (user_id, person_id, score)
于 2012-08-13T12:54:15.567 に答える