【问题标题】:Best way to store list of numbers and to retrieve them存储数字列表并检索它们的最佳方法
【发布时间】:2010-03-25 20:12:32
【问题描述】:

存储随机数列表(如乐透/宾果号码)并检索它们的最佳方法是什么?我想在数据库中存储许多行,其中每行包含 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 的一个数字,所以如果我在第 44 位有 1,这意味着我在该行有 44。这种方法可能会将困难的任务转移到 Db 上,但它又不是很聪明。

有什么建议吗?

【问题讨论】:

    标签: database search random


    【解决方案1】:

    你应该像这样创建一个表:

    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
    

    再次这样就可以使用索引了。

    【讨论】:

    • +1,一定要PK TicketId+Number,另外在Number上放一个索引
    • 非常简单,非常聪明。或者这个问题太愚蠢了。 ;)
    • @Mark Byers:谢谢更新。顺便说一句,你能说出为什么你需要全部删除联合吗?我认为它比“IN”命令更快。
    • @vcha:也许它更快,我不知道......但无论哪种方式,这似乎都是不必要的性能优化,特别是因为我没有对其进行分析。
    最近更新 更多