Самый быстрый способ создать таблицу поиска в MySQL

Я хочу создать таблицу соответствия для комбинаций покерных комбинаций. На 7-карточном столе 113 миллионов возможных комбинаций рук.

Если бы я дал каждой карточке номер, скажем (1-52), и хотел бы сохранить каждую возможную комбинацию в таблице, каков был бы наилучший способ сделать это? Я хочу, чтобы поиск производился быстро, поэтому, если у меня есть рука 13,18,1,51,38,8,49, я могу найти строку в таблице.

Я мог бы хранить каждую карточку в отдельном столбце так:

poker_hands (id, card1, card2, card3, card4, card5, card6, card7)

или я мог бы создать какое-то хеш-значение для 7 карт, например:

$string= md5($card1 . $card2 . $card3 . $card4 . $card5 . $card6. $card7);

Затем используйте это, чтобы найти руку

poker_hands (id, hash)

(Я также буду хранить информацию о ранге каждой руки в базе данных; но сейчас я просто хочу узнать, как лучше создать справочную таблицу.)

4

Решение

Начните с создания списка чисел от 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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]