我很困在一个 Mysql 查询上。我有一张三列的桌子;
user_id | person_id | score.
该表将用于存储每个人的前 5 个高分。
我需要在查询中检查特定人的行数是否少于五行。是不是少了,插入新行。但是如果有五行,我必须用新的替换最低分数。
它用于用 PHP 编写的 Web 服务,有关新分数的数据作为参数发布到方法中。
已经卡了几个小时了——甚至有可能在一个查询中实现这一点吗?
如果您有一个标识最低分数的唯一键,则它可能是可能的。然后你可以使用 INSERT ... ON DUPLICATE KEY 构造。但是您必须安装一个触发器来明确跟踪最低分数。
我会提出这种情况(我没有尝试过,这只是一个想法):
据我了解,您只需要 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), ... )
有可能的错误,也只有一个子查询是可能的,但我希望你明白主要的想法
你可以在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
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)