2

我很困在一个 Mysql 查询上。我有一张三列的桌子;

 user_id | person_id | score.

该表将用于存储每个人的前 5 个高分。

我需要在查询中检查特定人的行数是否少于五行。是不是少了,插入新行。但是如果有五行,我必须用新的替换最低分数。

它用于用 PHP 编写的 Web 服务,有关新分数的数据作为参数发布到方法中。

已经卡了几个小时了——甚至有可能在一个查询中实现这一点吗?

4

4 回答 4

0

如果您有一个标识最低分数的唯一键,则它可能是可能的。然后你可以使用 INSERT ... ON DUPLICATE KEY 构造。但是您必须安装一个触发器来明确跟踪最低分数。

于 2012-08-13T09:25:39.813 回答
0

我会提出这种情况(我没有尝试过,这只是一个想法):

据我了解,您只需要 5 个 ID。你可以运行这样的子查询

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),  ... )

有可能的错误,也只有一个子查询是可能的,但我希望你明白主要的想法

于 2012-08-13T09:27:50.457 回答
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

imo最简单的方法是插入数据,

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 回答