创建连续数字的mysql表

时间:2011-10-09 20:09:54

标签: mysql

您好我已经创建了一个名为allposs的表,其中包含6/49乐透的所有可能乐透结果,这似乎很容易。

create table allposs (
`id` mediumint (8) unsigned NOT NULL,
`n1` tinyint (3) unsigned NOT NULL,
`n2` tinyint (3) unsigned NOT NULL,
`n3` tinyint (3) unsigned NOT NULL,
`n4` tinyint (3) unsigned NOT NULL,
`n5` tinyint (3) unsigned NOT NULL,
`n6` tinyint (3) unsigned NOT NULL,
key `id` (`id`)
) engine=myisam;

创建一个生成结果的过程并将它们放在表中 这很好。

现在我需要使用此表中的结果制作其他表格,例如。

创建一个表“filter1”,其中包含所有连续的结果1,2,3,4,5,6 / 44,45,46,47,48,49
和另一个“filter2”有5个连续1,2,3,4,5,25,/ 1,10,11,12,13,14然后4consec 1,2,3,4,13,23,/ 1, 16,17,18,19.49等。

一旦我创建了所有这些,我需要查看/选择“allposs”表-minus“filter1”,“filter2”等。

我是mysql php的新手,并没有钱支付专业人员,所以我试图自己做,但我认为它将采取永远,因为我已经过了2周,并找不到解决方案。 我有非常基本的编程技巧但决心学习。 请任何帮助都会有所帮助。 我在ubuntu 11.4上使用mysql 5.1.54

2 个答案:

答案 0 :(得分:1)

这些将是相当慢的查询,因为您正在一个相当大的表中搜索。

查找所有6个数字都是连续的行。

慢速:

SELECT *
FROM allposs
WHERE n2 = n1+1
  AND n3 = n2+1
  AND n4 = n3+1
  AND n5 = n4+1
  AND n6 = n5+1

更快:

在桌面上添加复合索引(n1,n2,n3,n4,n5,n6) 同时添加(n2,n3,n4,n5,n6)索引,(n3,n4,n5,n6)等索引......,最多可添加(n6)索引。

然后,创建一个只有一列和49行的表:

CREATE TABLE num
  ( i TINYINT
  , PRIMARY KEY (i)
  ) ;

然后使用:

SELECT 
      ap.*
FROM 
      allposs AS ap
  JOIN
      num
    ON (n1,n2,n3,n4,n5,n6) = (i,i+1,i+2,i+3,i+4,i+5)

查找5个数字连续的行。

慢速:

    SELECT *
    FROM allposs
    WHERE n2 = n1+1
      AND n3 = n2+1
      AND n4 = n3+1
      AND n5 = n4+1
      AND n6 > n5+1
  UNION
    SELECT *
    FROM allposs
    WHERE n2 > n1+1
      AND n3 = n2+1
      AND n4 = n3+1
      AND n5 = n4+1
      AND n6 = n5+1

更快:

SELECT 
      ap.*
FROM 
      allposs AS ap
  JOIN
      num
    ON ( (n1,n2,n3,n4,n5) = (i,i+1,i+2,i+3,i+4) AND n6 > i+5 )
    OR ( n1 < i-1 AND (n2,n3,n4,n5,n6) = (i,i+1,i+2,i+3,i+4) )

如果您想要访问这些行,则可以将这些查询与 CREATE TABLE anothertable SELECT ... INSERT INTO anothertable SELECT ... 变体一起使用来填充更多表格必须每次都运行查询。

答案 1 :(得分:0)

因为列中的数字是有序的 - 即n1&lt; n2等 - 你可以在一个查询中获得很多东西:

select *
from (select
  id,n1,n2,n3,n4,n5,n6,
  (n1=n2-1) + (n2=n3-1)+ (n3=n4-1)+ (n4=n5-1)+ (n5=n6-1) as consecutive_count
  from allposs) x
) where consecutive_count > 0
order by consecutive_count desc, n1,n2,n3,n4,n5,n6;

此查询将首先返回包含6个连续数字的所有组合,然后返回包含5个连续数字等的所有组合,并且不会返回任何没有连续数字的组合。

有了这个,你应该能够编写你的php来处理行。

如果要使用单独的查询,请将条件更改为where consecutive_count = 3(例如)。