2012-10-09 21 views
0

我有一個查詢語句來選擇一個工具列表。這些工具需要放入2D矢量中,其中第一級是類別,第二級是類別的「桶」。使用Qt構建一個來自mysql查詢的2D矢量

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); 
} 
+0

您看到什麼低效率? –

+0

@PavelZdenek看我的編輯。它是循環中的if語句。我決定在category_id中首先使用SELECT DISTINCT創建桶可能更好,然後再執行另一個查詢來實際獲取所有工具。只要兩個查詢按category_id排序結果,它們就會落入正確的桶中。 – rem45acp

回答

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); 
}