我非常依赖于Mysql查询。 我有一个有三列的表格;
user_id | person_id | score.
该表将用于存储每个人的前5个高分。
我需要在查询时检查特定人员是否少于五行。 是否有更少,插入新行。但如果有五行我必须用新的一行取代最低分。
用于使用PHP编写的Web服务,有关新分数的数据将作为参数发布到方法中。
现在已经停留了几个小时 - 甚至可以在一个查询中实现这一点吗?
答案 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)