如果小于5,则添加一行,否则替换MySQL中的最小数字

时间:2012-08-13 08:48:35

标签: mysql sql

我非常依赖于Mysql查询。 我有一个有三列的表格;

 user_id | person_id | score.

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

我需要在查询时检查特定人员是否少于五行。 是否有更少,插入新行。但如果有五行我必须用新的一行取代最低分。

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

现在已经停留了几个小时 - 甚至可以在一个查询中实现这一点吗?

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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),  ... )

可能存在错误,也只有一个子查询可能,但我希望你能得到主要的想法

答案 2 :(得分: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测试(1); 1是参数,您可以根据需要创建多个参数。 从php可以直接调用

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

在这里你可以查看关于mysql存储过程的教程: http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx

答案 3 :(得分: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)