0

我有一个选择工具列表的查询语句。这些工具需要放入一个二维向量中,其中第一级是它的类别,第二级是类别的“桶”。

struct Tool {};
typedef boost::shared_ptr< Tool > ToolPtr;
typedef std::vector< ToolPtr > ToolVec;
typedef std::vector< ToolVec > ToolCategory;

查询语句如下所示:

const QString getTools =
"SELECT tool_id, category_id, category_name, tool_name FROM tool_relation "
"WHERE course_id = ? ORDER BY category_id ASC, tool_id ASC";

q.bindValue(0, courseID);
q.exec();

while (q.next())
{

}

我想用一个查询语句来做到这一点,但我能想到的唯一方法是使用指向正确存储桶的临时指针并测试每条记录以查看类别 ID 是否更改。似乎效率低下。

编辑:这样的事情是我只使用一个查询语句时想出的。

ToolVector *curBucket = 0;

int curCategory = 0;

while (q.next())
{
    if (q.value(1).toInt() != curCategory)
    {
        curCategory = q.value(1).toInt();

        ToolVec toolVec;

        curBucket = &toolVec;

        categories.push_back(toolVec);
    }

    ToolPtr toolPtr(new Tool(
                        q.value(0).toInt(),
                        q.value(2).toString()));

    curBucket->push_back(toolPtr);
}
4

1 回答 1

1

我们可能对“效率”的定义有所不同。对我来说,这是速度和内存要求。处理两个 SELECT 语句总是比处理一个更慢和更消耗,即使if对于每个返回的行都有语句。

但是,即使我对您的逻辑一无所知,我还是有些想念您将如何寻找工具桶。category_id不保存在任何地方,category_name只保存在Tool结构内部。除非您迭代所有工具,否则您无法找到存储桶。桶map呢?它还可以满足您的效率要求:

typedef std::map< int, ToolVec > ToolCategory;

while (q.next())
{
  curCategory = q.value(1).toInt();
  ...      
  categories[curCategory].push_back(toolPtr);
}
于 2012-10-10T08:27:43.163 回答