gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:53:53 25 4
gpt4 key购买 nike

我有一种情况,我在两个表之间执行连接,我需要一个表中的值用作连接中子查询的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com