关于动态大小查询的PDO和预处理语句

时间:2014-02-01 05:03:39

标签: php mysql sql

我正在开发一个小型游戏网站,用于大学节目,用户参加少数竞赛,并根据他们在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种不同的动态查询。

1 个答案:

答案 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 演示