php - 如何在 SQL 查询中使用选择的结果作为偏移量

标签 php mysql sql offset

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

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

例子:

用户回答:

  1. 用户 1 - 5 分
  2. 用户 1 - 15 分
  3. 用户 2 - 8 分
  4. 用户 3 - 12 分

排名表:

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

解决方案:

第一个查询计算中间点:

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

查询结果:

position : 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吗?


编辑:

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

最佳答案

尝试这样的事情:

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;

关于php - 如何在 SQL 查询中使用选择的结果作为偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20664102/

相关文章:

php - MYSQL 缺少第一行数据

php - 根据另一个 SQL PHP 的结果从一个表中获取数据

php - MYSQL - 如果第一个字段不为空,则更新第二个字段,如果第二个字段不为空,则更新

sql - 如何统计图中常见的双向连接数

php - 如何在PHP文件中使用JSON进行跨域调用?

php - 使用 CentOS 8 在 PHP 7.4 中安装 pdo_sqlsrv 驱动程序

MySQL 似乎无法连接空字段

sql - 在数据库中的所有行上调用触发器

php - 将 str_replace() 与从 SQL 数据库导入的字符串结合使用

php - 解析多语言提要的最佳实践