6

我正在尝试构建一个代表食谱列表的 ListView。我得到了使用 aSimpleCursorAdapter来实现这一点的概念。

但是,除了显示每个项目的食谱图像和标题之外,我还想显示与该食谱相关的以逗号分隔的一串配料。鉴于游标仅适用于一个表(或视图),我不太确定如何处理这个问题。

相关表格/列如下:

recipes (
  _id integer primary key,
  name text not null
)

ingredients (
  _id integer primary key,
  name text not null
)

recipes_ingredients (
  _id integer primary key,
  recipe_id integer not null,
  ingredient_id integer not null
)

编辑:关于这个问题的前两条评论让我相信没有足够的信息来说明为什么我认为简单的 JOIN 是不够的。给定表格结构,一个食谱可以有多种成分,而不仅仅是一种。这意味着如果我尝试为单个配方执行连接,我最终会得到如下内容:

SELECT r.name AS recipe, i.name AS ingredient
FROM recipes r
INNER JOIN recipes_ingredients ri ON ri.recipe_id=r._id
INNER JOIN ingredients i ON ri.ingredient_id=i._id;

 recipe           | ingredient
------------------+---------------------
 Chocolate Milk   | milk
 Chocolate Milk   | chocolate syrup
 Chicken Parmesan | chicken breast
 Chicken Parmesan | italian breadcrumbs
 Chicken Parmesan | egg
 Chicken Parmesan | shredded mozzarella
 Chicken Parmesan | pasta sauce

一个简单的光标最终会显示“Chocolate Milk”两次和“Chicken Parmesan”五次。这绝对不是我想要的。我希望它们中的每一个都以逗号分隔的所有成分显示一次。IE:

 recipe           | ingredients
------------------+---------------------------------------------------------------------------
 Chocolate Milk   | milk, chocolate syrup
 Chicken Parmesan | chicken breast, italian breadcrumbs, egg, shredded mozzarella, pasta sauce
4

1 回答 1

7

您需要的是 group_concat:http ://www.sqlite.org/lang_aggfunc.html

这应该有效:

SELECT r._id, r.name AS recipe, group_concat(i.name, ",") AS ingredient
FROM recipes r
INNER JOIN recipes_ingredients ri ON ri.recipe_id=r._id
INNER JOIN ingredients i ON ri.ingredient_id=i._id
GROUP BY r._id;
于 2013-04-29T14:10:42.353 回答