使用mysql(25.000+表行)查找连续的数字范围

时间:2014-12-15 14:38:55

标签: mysql mysql-error-1064

我需要从一组“系列”(仅限数字)中找到连续的数字范围(最小值,最大值)。

我使用 @row_number 编写了一个SQL,但它部分工作。如果行ID(int,primary,auto_increment)不连续,则返回2个结果集而不是一个。

检查this sqlfiddle以查看查询的工作原理。

所以我需要找到一种方法,不使用@row_number或使用它,但条件是将2个结果“绑定”为单个,系列是连续的(即使ID不连续)。< / p>

正确的结果应该是:(见this sqlfiddle

MIN   MAX   PRODUCT_ID
220   230   20
1106  1108  18
1110  1110  18
1112  1120  18

响应时间也很重要。

由于

1 个答案:

答案 0 :(得分:1)

我认为你是在追求这样的事情......

SELECT a.product_id
     , a.series start
     , MIN(c.series) end 
  FROM card a
  LEFT 
  JOIN card b 
    ON b.product_id = a.product_id
   AND b.series = a.series - 1
  LEFT 
  JOIN card c 
    ON c.product_id = a.product_id
   AND c.series >= a.series
  LEFT 
  JOIN card d 
    ON d.product_id = a.product_id
   AND d.series = c.series + 1
 WHERE b.series IS NULL 
   AND c.series IS NOT NULL
   AND d.series IS NULL
 GROUP 
    BY a.product_id
     , a.series; 

http://sqlfiddle.com/#!2/32dc8/4

如果性能仍然存在问题,那么我们可以再看看@variables

的解决方案