代码之家  ›  专栏  ›  技术社区  ›  Thomas Matthews

迭代1到多个表时丢失结果

  •  0
  • Thomas Matthews  · 技术社区  · 14 年前

    我的难题是,当访问一个外键表时,我正在丢失主表中的结果集。我需要在查询另一个表时保存第一个表查询的结果。

    风景:
    我正在实现一个配方数据库系统。每个配方可以有1到多种成分。为了解决1对多的关系,我为成分创建了一个单独的表。

    我有一张食谱表:

      ID_Recipe: primary key, integer;   
      Recipe_Title: CHAR(128);
    

    和配料表:

    ID_Ingredient:  PRIMARY KEY, INTEGER;  
    ID_Recipe:  INTEGER NOT NULL;  
    Ingredient_Title: CHAR(64)  
    

    在我的程序中,我有一个包含成分向量的配方对象:

    struct Ingredient
    {
      int ID;
      int recipe_ID;
      std::string title;
    };
    
    struct Recipe
    {
      int ID;
      std::string title;
      std::vector<Ingredient> recipe_ingredients;
    };
    

    为了执行 对于每一个 在表中的一个配方上迭代,我必须从数据库中加载它。为了完成这个食谱,我必须加入与这个食谱相关的所有成分。

    问题是,当我加入配料时,我会失去食谱的结果集。这个 MySQL连接器C++ 一次只能处理一个结果集。我也没有成功地复制结果(当表大小增大时,我可能不想加载整个结果)。

    那么,当我从成分表中搜索和加载时,如何维护一个指向配方表的光标或指针呢?

    我想做的是:

    1. 对于表中的每个配方,请执行以下操作:
    2. 将配方结果行数据读取到 配方变量。
    3. 使用配方ID选择全部 配方中的成分.id_配方= 配料表。
    4. 从成分表加载结果 配方变量的向量。
    5. 传递配方对象以回调 功能。
    6. 前进到表中的下一个配方。
    7. 结束

    提前谢谢你的建议。
    (我使用MySQL、MySQL连接器C++、Visual Studio 2008—C++)

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jim Garrison    14 年前

    AFICT,MySQL连接器/C++ DOC中没有任何东西表明打开第二个结果集会使第一个结果无效。请发布用于处理行的代码。您可能正在做一些过早关闭第一个结果集的操作。

        2
  •  1
  •   Hogan    14 年前

    只返回一个结果集。有一个(或多个)列称为“配方”,它对每种配料都保持不变。做一个连接。

    select * from recipe left join ingr on recipe. ID_Recipe = ingr. ID_Recipe

    这会给你一张你循环的桌子…当配方名称改变时,你就知道你正在使用一个新的配方。