Лучший способ сохранить список номеров и получить их - PullRequest
2 голосов
/ 25 марта 2010

Каков наилучший способ сохранить список случайных чисел (например, номера лото / бинго) и получить их? Я хотел бы сохранить в базе данных количество строк, где каждая строка содержит 5-10 чисел в диапазоне от 0 до 90. Я буду хранить большое количество этих строк. То, что я хотел бы иметь, - это получить строки, которые имеют хотя бы общее число X для вновь созданной строки.

Пример:

[3,4,33,67,85,99]
[55,56,77,89,98,99]
[3,4,23,47,85,91]

Они есть в БД

Я сгенерирую это: [1,2,11,45,47,88] и теперь я хочу получить строки, имеющие хотя бы 1 общее число с этим.

Самый простой (и глупый?) Способ - выбрать 6 и проверить наличие похожих результатов.

Я думал хранить числа с большой двоичной строкой, например 000000000000000000000100000000010010110000000000000000000000000 с 99 числами, где каждое число представляет число от 1 до 99, поэтому, если у меня 1 на 44-й позиции, это означает, что у меня 44 в этом ряду. Этот метод, вероятно, переносит сложные задачи на Db, но опять же он не очень умен.

Есть предложения?

1 Ответ

4 голосов
/ 25 марта 2010

Вы должны создать таблицу примерно так:

TicketId Number
1        3
1        4
1        33
1        67
1        85
1        99
2        55
2        56
2        77
etc...

Тогда ваш запрос, по крайней мере для X = 1, становится:

SELECT DISTINCT TicketId FROM Ticket WHERE Number IN (1, 2, 11, 45, 47, 88)

Преимущество этого заключается в том, что вы можете использовать индекс вместо полного сканирования таблицы.

Для X больше единицы вы можете сделать следующее:

SELECT TicketId, COUNT(*) AS cnt
FROM Ticket WHERE Number IN (1, 2, 11, 45, 47, 88)
GROUP BY TicketId
HAVING COUNT(*) >= 3

Снова это сможет использовать индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...