不同列中不同数字的对策

时间:2016-05-05 15:33:35

标签: android sql sqlite

首先,抱歉,如果这是一个重复的问题...

我有一个Android应用程序(SQLITE),用于检查Lotery游戏。基本上,这个抽奖在40个中抽取5个数字,我将其保存如下:

|---------------------------------------------------------------------------|
|                               TABLE: lotery                               |
|---------------------------------------------------------------------------|
|   game_number |   NUM1    |   NUM2    |   NUM3    |   NUM4    |   NUM5    |
|---------------------------------------------------------------------------|
|       1       |    02     |    32     |    33     |    34     |    40     |
|       2       |    02     |    14     |    16     |    39     |    40     |
|       3       |    01     |    11     |    12     |    25     |    27     |
|       4       |    02     |    22     |    23     |    30     |    36     |
|                                   ......                                  |
|---------------------------------------------------------------------------|

现在,我想咨询选择号码的频率。

示例:

  • 01号被抽出一次(在game_number == 3中)
  • 数字02被抽出3次(在game_number == 1,game_number == 2和game_number == 4))
  • 等等...

我今天所拥有的:

SELECT * FROM
        (select count(*) FROM lotery where 1 IN(NUM1,NUM2,NUM3,NUM4,NUM5)),
        (select count(*) FROM lotery where 2 IN(NUM1,NUM2,NUM3,NUM4,NUM5)),
        (select count(*) FROM lotery where 3 IN(NUM1,NUM2,NUM3,NUM4,NUM5)),
        ....
        (select count(*) FROM lotery where 40 IN(NUM1,NUM2,NUM3,NUM4,NUM5));

这将产生:

|-----------------------------------------------------------|
|  count(*) |  count(*) |  count(*) |  ......   |  count(*) |
|-----------------------------------------------------------|
|     1     |     3     |     0     |  ......   |     2     |
|-----------------------------------------------------------|

第一列对应于“01”。第二列对应于数字“02”。等......直到第40列

最后的问题

目前的实施方案在一些旧的和低成本的设备中性能较低。

所以,我有以下问题:

  1. 您是否看到了对当前表实现的更好查询?

  2. 是否可以查询并获取订购结果?

  3. 今天,我执行该查询,并按DESC顺序手动对结果进行排序。我的活动以DESC顺序在列表视图中显示结果。

    由于我正在使用列表视图,因此我不需要立即获得所有结果。例如,我只能查询前10个更频繁的数字(填充屏幕),如果用户滚动列表视图,则只查询剩余数字。

    无论如何,如果你看到当前实施有任何可能的改进,我将不胜感激......

    提前多多感谢!!

1 个答案:

答案 0 :(得分:2)

  

1。您是否看到了对当前表实现的更好查询?

是的,请查看以下内容:)

  

2.是否可以查询并获得订购结果?

您可以使用计数表和LEFT JOIN

WITH num(n) AS
(
   VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)
         ,(11),(12),(13),(14),(15),(16),(17),(18),(19),(20)
         ,(21),(22),(23),(24),(25),(26),(27),(28),(29),(30)
         ,(31),(32),(33),(34),(35),(36),(37),(38),(39),(40)
)
SELECT num.n, COUNT(l.game_number) AS cnt
FROM num 
LEFT JOIN lottery l
  ON num.n IN (l.NUM1, l.NUM2,l.NUM3, l.NUM4,l.NUM5)
GROUP BY num.n
ORDER BY cnt DESC, num.n;

SqlFiddleDemo

输出:

╔═════╦═════╗
║ n   ║ cnt ║
╠═════╬═════╣
║  2  ║   3 ║
║ 40  ║   2 ║
║  1  ║   1 ║
║ 11  ║   1 ║
║ 12  ║   1 ║
║ 14  ║   1 ║
║ 16  ║   1 ║
║ 22  ║   1 ║
║ 23  ║   1 ║
║ 25  ║   1 ║
║ 27  ║   1 ║
║ 30  ║   1 ║
║ 32  ║   1 ║
║ 33  ║   1 ║
║ 34  ║   1 ║
║ 36  ║   1 ║
║ 39  ║   1 ║
║  3  ║   0 ║
║  4  ║   0 ║
║  5  ║   0 ║
║  6  ║   0 ║
║  7  ║   0 ║
║  8  ║   0 ║
║  9  ║   0 ║
║ 10  ║   0 ║
║ 13  ║   0 ║
║ 15  ║   0 ║
║ 17  ║   0 ║
║ 18  ║   0 ║
║ 19  ║   0 ║
║ 20  ║   0 ║
║ 21  ║   0 ║
║ 24  ║   0 ║
║ 26  ║   0 ║
║ 28  ║   0 ║
║ 29  ║   0 ║
║ 31  ║   0 ║
║ 35  ║   0 ║
║ 37  ║   0 ║
║ 38  ║   0 ║
╚═════╩═════╝

修改

  

似乎SQLITE3嵌入Android API16是v3.7.11你看到了吗?   使用你回答的限制?

如果不支持WITH,您可以使用子查询轻松更改它:

SELECT num.n, COUNT(l.game_number) AS cnt
FROM (SELECT 1 AS n
      UNION SELECT 2
      UNION SELECT 3
       -- ... up to 40
      ) num
LEFT JOIN lottery l
  ON num.n IN (l.NUM1, l.NUM2,l.NUM3, l.NUM4,l.NUM5)
GROUP BY num.n
ORDER BY cnt DESC, num.n;

SqlFiddleDemo2