计算行数直到达到值

时间:2015-08-21 07:45:10

标签: php mysql

我正在尝试找到一种方法来计算用户数量,直到达到该数量。这有点像我的桌子设置方式。

ID    Quantity
1           10
2           30
3           20
4           28

基本上,我想组织行数量从最大到最小。然后我希望它计算从最高数量到你提供的任何ID所需的行数。例如,如果我正在寻找ID#4,它会查看从最大到最小的数量,然后告诉我它是第2行,因为它只占用了2行,因为它包含第2个最高数量。

还有另一种方法可以对此进行编码,但我觉得它对资源的要求太高而且涉及到PHP。我可以根据最大值到最小值对我的数据库进行循环,每次经过另一个循环时,我都会加+1。所以,这样,我可以做一个IF语句来确定它何时达到我的值。然而,当我有数以千计的价值观时,它必须经历,我觉得这对资源要求太高了。

2 个答案:

答案 0 :(得分:0)

总的来说,这是一个简单的排序问题。任何数据结构都可以为您提供项目的行,在某些情况下会稍作修改。

如果您计划多次使用此操作,则可以通过维护表的单独排序副本,使用分摊的O(log(n))来超过理论O(n log(n))运行时间按数量排序。这将问题简化为二进制搜索。

第三种方法是以新的排序顺序维护表条​​目的虚拟链表。这会将表中的插入时间增加到O(n),但会将此问题减少到O(1)

第四种解决方案是维护虚拟平衡树,但是,尽管理论性能良好,但这种解决方案很难实现。

答案 1 :(得分:0)

这可能不是您期望的答案,但是:在达到某个值后,您无法“停止”执行查询。在分析之前,MySQL总会生成完整的结果集。这是因为,为了按Quantity对结果进行排序,MySQL需要拥有所有行。

因此,如果你想这样做是纯MySQL,你需要在临时表中计算行号(如MySQL - Get row number on select所述),然后从那里选择你的ID。

示例:

SET @rank = 0;
SELECT *
FROM (
  SELECT Id, Quantity, @rank := @rank + 1 as rank
  FROM table
  ORDER BY Quantity
) as ordered_table
WHERE Id = 4;

如果性能是一个问题,你可以使用Quantity上的索引来加快速度(待测试)。否则,最好的方法是将“rank”值存储在一个单独的表中(仅包含2列:Id和Rank),可能还有一个触发器可以在插入/更新时刷新表。