首先,抱歉,如果这是一个重复的问题...
我有一个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 |
| ...... |
|---------------------------------------------------------------------------|
现在,我想咨询选择号码的频率。
示例:
我今天所拥有的:
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列
最后的问题
目前的实施方案在一些旧的和低成本的设备中性能较低。
所以,我有以下问题:
您是否看到了对当前表实现的更好查询?
是否可以查询并获取订购结果?
今天,我执行该查询,并按DESC顺序手动对结果进行排序。我的活动以DESC顺序在列表视图中显示结果。
由于我正在使用列表视图,因此我不需要立即获得所有结果。例如,我只能查询前10个更频繁的数字(填充屏幕),如果用户滚动列表视图,则只查询剩余数字。
无论如何,如果你看到当前实施有任何可能的改进,我将不胜感激......
提前多多感谢!!
答案 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
强>