如何在SQL查询中将select的结果用作偏移量

时间:2013-12-18 17:02:11

标签: php mysql sql offset

我试图创建一个单独的SQL查询来返回我需要的内容,而不是创建2个查询,但我需要使用其中一个查询的结果作为另一个查询的offset

我的表具有分数的用户答案,每个用户可能在该表中有多个答案。我想计算有序分数表的中间点。

示例:

用户回答:

  1. 用户1 - 5分
  2. 用户1 - 15分
  3. 用户2 - 8分
  4. 用户3 - 12分
  5. 排名表:

    1. 用户1 - 20分
    2. 用户3 - 12分<中间点
    3. 用户2 - 8分

    4. 解决方案:

      第一个查询计算中间点:

      SELECT CEILING(count(Distinct(id_user)) / 2) as position 
      FROM us_user_response 
      where id_round=1
      

      查询结果:

        

      职位:2

      第二个查询创建有序排名表:

      SELECT sum(points) as score 
      FROM us_user_response 
      where id_round=1 
      GROUP BY id_user 
      Order by score DESC
      

      现在我想创建一个返回中间用户得分的大查询,我只需要将第一个查询结果用作第二个查询的offset

      SELECT sum(points) as score 
            FROM us_user_response 
            where id_round=1
            GROUP BY id_user 
            Order by score DESC LIMIT 1
              OFFSET (SELECT CEILING(count(Distinct(id_user)) / 2) as position 
                      FROM us_user_response where id_round=1)
      

      当然,这不起作用,有没有办法将结果用作offset


      修改

      查询效果很好!我的问题是,是否有任何方法可以将查询结果用作另一个查询的结果。所以我可以在一个查询中完成这个。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

SET @line_id = 0;
SET @line_offset = (
    SELECT CEILING(count(Distinct(id_user)) / 2) as position 
    FROM us_user_response 
    WHERE id_round = 1
);

SELECT sum(points) as score,
    IF((@line_id := @line_id + 1) = @line_offset, 1, 0) AS useit 
FROM us_user_response 
WHERE id_round = 1
GROUP BY id_user 
HAVING useit = 1
ORDER BY score;