mysql - 执行连接时使用 LIMIT 的表列值

标签 mysql join limit greatest-n-per-group

我有一种情况,我在两个表之间执行连接,我需要一个表中的值用作连接中子查询的 LIMIT 因子。假设我有以下 [极度简化] 表 -

data:

experiment_id | value
--------------|--------
       1      |  2.5
       1      |  2.6
       1      |  4.5
       1      |  2.3
       1      |  3.5
       1      |  2.8
       2      |  2.3
       2      |  1.2
       2      |  1.1
       2      |  3.6
       2      |  3.8
       2      |  4.1
       2      |  7.9
       2      |  4.2
       2      |  1.0


data_clip:

experiment_id | clip_index
--------------|------------
       1      |     3
       2      |     5

我需要将每个实验的排序 值加总到某个 clip_index,该索引因实验而异。因此,理想情况下,我的结果表将如下所示:

results:
experiment_id |  sum
--------------|-------
       1      |  7.6    # => 2.3 + 2.5 + 2.8
       2      | 13.0    # => 1.0 + 1.1 + 1.2 + 2.3 + 3.6 + 3.8 

通常,我会使用一些客户端脚本(ruby、python 等)来执行此计算,但我想尝试在数据库级别执行此操作。一些假想的 SQL 可能看起来像这样(我知道这个查询有各种各样的错误,但希望你明白了):

SELECT 
  T0.experiment_id as `id`,
  (SELECT SUM(x.value) from
       (SELECT   value 
        FROM     data 
        WHERE    experiment_id = t0.experiment_id
        ORDER BY value 
        LIMIT    t0.clip_index ) as x) AS `sum`
FROM data_clip AS t0

几个问题:

  1. 必须使用常量(1000、10 等)而不是列来定义 LIMIT。
  2. 子查询中的 WHERE 条件因无法识别子查询外部的 t0 表而失败。

我的问题基本上是如何主要使用 SQL 来完成两个表之间的变量限制和求和。我考虑过使用 group_concatsubstring_index 来隔离每一行的值,直到 clip_index ,但随后出现了对编号字符串求和的问题("1.2,2.3,3.2") 和服务器对 group_concat 缓冲区大小的限制(可配置,但每个实验的值可能约为 100k)。有什么想法吗?谢谢。

最佳答案

我想您只需要在每个选定的值中包含一个行号,并通过行数限制结果 是这样的: (非未测试)

SELECT T0.experiment_id as `id`,   
(SELECT SUM(x.value) from       
 (SELECT value,@rownum := @rownum + 1 AS rownum           
  FROM data         
  JOIN (SELECT @rownum := 0) r
  WHERE experiment_id = t0.experiment_id         
  ORDER BY value             
 ) AS x
WHERE x,rownum < t0.clip_index
) AS `sum`
 FROM data_clip AS t0

参见:MySQL - Get row number on select

关于mysql - 执行连接时使用 LIMIT 的表列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7075643/

相关文章:

mysql - SQL 查询 - 在小于或等于日期加入

php - MYSQL中如何连接所有三个表?

list - 在CMake中加入列表的最佳/最短方法

javascript - 如何将两个值或参数从两个下拉列表传递给ajax?

Mysql显示记录甚至没有结果

javascript - 为什么 queryAsync() 会导致添加元数据?

http - 两台服务器之间同一域的最大并发 http 连接数

kubernetes - Kubernetes发布要求CPU

java - JDBC/结果集错误

mysql - 时间值 mysql 之间的比较运算符