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

使用mysql查找连续的数字范围(25.000+;表行),mysql,mysql-error-1064,Mysql,Mysql Error 1064,我需要从一组“序列”(仅数字)中找到连续的数字范围(最小值、最大值) 我使用@row\u number编写了一个SQL,但它部分工作。如果行ID(int、primary、auto_increment)不连续,它将返回两个结果集,而不是一个 查看查询的工作方式 因此,我需要找到一种方法来做到这一点,不使用@row_number或使用它,而是使用一个条件来“绑定”2个结果到单个结果,因为序列是连续的(即使ID不是连续的) 正确的结果应该是:(参见) 响应时间也很重要 谢谢我想你想要的是这样的东西 S

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

我使用@row\u number编写了一个SQL,但它部分工作。如果行ID(int、primary、auto_increment)不连续,它将返回两个结果集,而不是一个

查看查询的工作方式

因此,我需要找到一种方法来做到这一点,不使用@row_number或使用它,而是使用一个条件来“绑定”2个结果到单个结果,因为序列是连续的(即使ID不是连续的)

正确的结果应该是:(参见)

响应时间也很重要


谢谢

我想你想要的是这样的东西

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; 


如果性能仍然是一个问题,那么我们可以再看一看带有@variables的解决方案。我刚刚在我的数据库上运行了您的查询,这需要很长时间。事实上,我没有得到任何结果,MySQL Workbench在一段时间后停止了。(表目前只有10.000,我需要让它与25.000一起工作)您有关于(product_id,series)的综合索引吗?“product_id”是外键,“series”没有索引,尝试使用前面描述的复合索引。一个可变的解决方案可能会执行得更好——但这里还有其他人在这些查询方面比我好得多。
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;