ツールのリストを選択するクエリ ステートメントがあります。これらのツールは 2D ベクトルに配置する必要があります。最初のレベルはそのカテゴリで、2 番目のレベルはカテゴリの「バケット」です。
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())
{
}
これを 1 つのクエリ ステートメントで実行したいのですが、考えられる唯一の方法は、正しいバケットへの一時的なポインターを使用し、すべてのレコードをテストして、カテゴリ ID が変化するかどうかを確認することです。効率が悪いようです。
編集:このようなものは、クエリステートメントを1つだけ使用するときに思いついたものです。
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);
}