我正在开发一个小型游戏网站,用于大学节目,用户参加少数竞赛,并根据他们在result
表中的排名,积分在他们的user
表中更新。然后,result
表将被截断以用于下一个事件。模式如下:
user
-------------------------------------------------------------
user_id | name | college | points |
-------------------------------------------------------------
result
---------------------------
user_id | score
---------------------------
现在,前3名学生获得100分,接下来15名获得50分,其他学生获得10分。
现在,我在开发查询时遇到问题,因为我不知道有多少用户会尝试比赛,因此我必须在查询中添加许多?
。其次,我还需要将)
放在最后。
我的查询就像
$query_top3=update user set points =points+100 where id in(?,?,?);
$query_next5=update user set points = points +50 where id in(?,?,?,?,?);
$query_others=update user set points=points+50 where id in (?,?...........,?);
如何动态准备这些查询?或者,有没有更好的方法?
修改
虽然它与this question类似,但在我的场景中我有3种不同的动态查询。
答案 0 :(得分:1)
如果我正确理解您的要求,您可以在一个查询中对结果进行排名并更新用户表(添加点)
UPDATE users u JOIN
(
SELECT user_id,
(
SELECT 1 + COUNT(*)
FROM result
WHERE score >= r.score
AND user_id <> r.user_id
) rank
FROM result r
) q
ON u.user_id = q.user_id
SET points = points +
CASE
WHEN q.rank BETWEEN 1 AND 3 THEN 100
WHEN q.rank BETWEEN 4 AND 18 THEN 50
ELSE 10
END;
它基于result
表中的内容完全动态化。您不再需要单独处理每个user_id
。
这是 SQLFiddle 演示