sqlite查询 - 如何从按行范围过滤的单行中获取多个结果?

时间:2012-11-21 17:02:08

标签: sqlite callback

我在编程方面很陌生,并且有意使用cocos2dx和sqlite制作游戏。但我遇到了这个问题,我找不到一个例子,或者怎么做。

我要做的第一件事就是从一个已经过范围过滤的表中随机选择一行。例如,有一个包含100行的表。如果我在D列的值1~10之间进行过滤,则会产生20行。从这20个我想随机选择其中一个。

其次,对于随机选择的行,我想收集5个不同的值,但到目前为止,我无法找到有关如何收集它们的工作示例。

以下是我尝试提出但不起作用的代码:

  • 查询
int MinColumnD = 1;
int Max ColumnD = 10;
int Dice =  ( rand() % 19 ) + 1;
char sql_query[100];
sprintf(sql_query, "SELECT A, B, C, D, E FROM SQList WHERE (ColumnD BETWEEN %d AND %d) ORDER BY RANDOM() LIMIT 1", MinColumnD, MaxColumnD);
std::list<INFO> details;
sqlite3_exec(DB, sql_query, CallBack, &details, &errorMessage);

*感谢CL的评论我更新了上面的查询以包含order by random()Limit 1.但是当我运行它并进入该部分时,我在xcode上得到了这个错误:

 Thread 1
 0 sqlite3_exec
 0x54cbd8: movl 60(%ebx), %eax   < Thread 1: EXC_BAD_ACCESS (code=1, address=0x444e418e)

这似乎只有在我将'ORDER BY RANDOM()'作为查询的一部分包含时才会发生

  • 回调
int CallBack( void * pOutCount, int argc, char ** argv, char **azColName ){

std::list<Class::INFO> *pList = (std::list<Class::INFO >*)pOutCount;
Class::INFO items;
items._A = argv[0];
items._B = atoi(argv[1]);
items._C = atoi(argv[2]);
items._D = atoi(argv[3]);
items._E = atoi(argv[4]);
pList->push_back( items );
return 0;

}
  • STRUCT
struct Class::INFO {

std::string _A;
int _B;
int _C;
int _D;
int _E;

};

*也许是因为sqlite查询不完整所以我没有得到正确的结果,但我不确定我是如何从std :: list获取返回的值列表。认为在查询之后我可以调用列表中的组件来获取类似的值是正确的:

std::string A = details._A;
int B = details._B;
int C = details._C;
int D = details._D;
int E = details._E;

请帮忙!

1 个答案:

答案 0 :(得分:0)

您不知道哪个rowid会在过滤结果中结束,因此您无法使用它们。

要从过滤结果中获取一些随机记录,请首先对其进行排序randomly,然后排序take the first record

SELECT A, B, C, D, E
FROM SQList
WHERE ColumnD BETWEEN ? AND ?
ORDER BY RANDOM()
LIMIT 1