Php 在MySQL中创建查找表的最快方法
我想为扑克手的组合创建一个查找表。在一个7张牌的棋盘上有1.13亿种不同的手部组合 如果我给每张卡一个数字,比如说(1-52),并想在表中存储每个可能的组合,那么最好的方法是什么?我希望它能够快速查找,这样,如果我有一只手13,18,1,51,38,8,49,我就可以搜索表中的行 我可以将每张卡片存储在它自己的列中,如下所示:Php 在MySQL中创建查找表的最快方法,php,mysql,sql,lookup,poker,Php,Mysql,Sql,Lookup,Poker,我想为扑克手的组合创建一个查找表。在一个7张牌的棋盘上有1.13亿种不同的手部组合 如果我给每张卡一个数字,比如说(1-52),并想在表中存储每个可能的组合,那么最好的方法是什么?我希望它能够快速查找,这样,如果我有一只手13,18,1,51,38,8,49,我就可以搜索表中的行 我可以将每张卡片存储在它自己的列中,如下所示: poker_hands (id, card1, card2, card3, card4, card5, card6, card7) 或者我可以为7张卡片创建某种散列值,
poker_hands (id, card1, card2, card3, card4, card5, card6, card7)
或者我可以为7张卡片创建某种散列值,如:
$string= md5($card1 . $card2 . $card3 . $card4 . $card5 . $card6. $card7);
然后用它来查找手
poker_hands (id, hash)
(我还将在数据库中存储每只手的排名信息;但现在我只想知道创建查找表的最佳方法。)首先创建一个从1到52的数字列表。您可以通过以下方式执行此操作:
create table numbers as
select 1 as n union all select 2 union all . . .;
或者,从已存在的表中:
create table numbers as
select (@rn := @rn + 1) as n
from t
limit 52;
然后,使用交叉连接创建组合:
create table hands as
select n1.n as card1, n2.n as card2, n3.n as card3, n4.n as card4,
n5.n as card5, n6.n as card6, n7.n as card7
from numbers n1 cross join
numbers n2 cross join
numbers n3 cross join
numbers n4 cross join
numbers n5 cross join
numbers n6 cross join
numbers n7;
这可能是数据库中最快的方法
编辑:
如果卡片应不同,则将其放入适当的条件中:
create table hands as
select n1.n as card1, n2.n as card2, n3.n as card3, n4.n as card4,
n5.n as card5, n6.n as card6, n7.n as card7
from numbers n1 join
numbers n2
on n2.n not in (n1.n) join
numbers n3
on n3.n not in (n1.n, n2.n) join
numbers n4
on n4.n not in (n1.n, n2.n, n3.n) join
numbers n5
on n5.n not in (n1.n, n2.n, n3.n, n4.n) join
numbers n6
on n6.n not in (n1.n, n2.n, n3.n, n4.n, n5.n) join
numbers n7
on n7.n not in (n1.n, n2.n, n3.n, n4.n, n5.n, n6.n);
杂烩看起来不错。但是如果你生成了它,检查一下,有没有重复的。我不知道1.13亿条记录的性能,我认为这应该不会有问题,但如果你坚持使用它,你可以尝试使用nosql。使用a将你的对存储在一个静态结构中。然后您可以相当快地访问它。为什么不将七个卡ID一起作为键(格式为%02d,以避免像1,2=12这样的错误)从较低的值变为较高的值?例如,对于组合卡2、43、25、31、1、10和11,id应该是01021011253143,我认为有1.337亿combinations@Amarnasan散列有效地做同样的事情,但效率更高。这也会有像1,1,1,1,1,1这样的组合,它们在当前上下文中无效。