我正在寻找一种方法来选择,直到达到一笔金额。
我的“文档”表格中包含“tag_id
”和“size
”字段。
我想用tag_id = 26
选择所有文件,但我知道我只能处理600个单位的尺寸。因此,当我知道前10个文件已经添加到>时,选择100个文档并丢弃其中的90个文件是没有意义的。 600个单位。
所以,目标是:当我要丢弃大部分数据时,不要带回大量数据来解析。
...但我也非常想避免在此应用中使用游标。
我正在使用mysql。
答案 0 :(得分:7)
在添加最大单位时,您需要某种方式来订购哪些记录优先于其他记录。否则,你怎么知道你保留的总记录数是多少?
SELECT d.id, d.size, d.date_created
FROM documents d
INNER JOIN documents d2 ON d2.tag_id=d.tag_id AND d2.date_created >= d.date_created
WHERE d.tag_id=26
GROUP BY d.id, d.size, d.date_created
HAVING sum(d2.size) <= 600
ORDER BY d.date_created DESC
这只是一个让您入门的基本查询,还有许多问题需要解决:
修改强>
更新后,他添加了他按日期排序的信息。
答案 1 :(得分:0)
效率低得多,但它确实避免了游标(假设你的文档表也有一个序列id列):
select a.id, (select sum(b.size) from documents b where b.id <= a.id and b.tag_id = 26)
from documents a
where a.tag_id = 26
order by a.id
另外,这是在pgsql中完成的,所以我不确定这个确切的语法是否适用于mysql。
然后你可以将它包装在另一个查找具有&gt;的查询中。 600(你必须命名sum列)并取第一个id。然后处理下面的所有ID,包括那个。
答案 2 :(得分:0)
您必须首先将文档存储在表变量中,按照要检索它们的顺序对它们进行排序,然后使用累积值更新每一行,以便您可以选择它。
declare @documents_temp table (
tag_id int,
size int,
cumulative_size int null)
insert into @documents_temp
select tag_id, size, size from documents order by tag_id
update @documents_temp d set d.cumulative_size = d.size +
(select top 1 cumulative_size from @documents_temp
where tag_id < d.tag_id order by tag_id desc)
select tag_id, size from @documents_temp where cumulative_size <= 600
不知道是否值得。