6

レシピのリストを表す ListView を作成しようとしています。SimpleCursorAdapterそれを達成するためにa を使用するという概念を理解しました。

ただし、各アイテムのレシピ画像とタイトルを表示するだけでなく、レシピに関連付けられた材料のカンマ区切りの文字列を表示したいと考えています。カーソルは 1 つのテーブル (またはビュー) のみを対象としているため、これにアプローチする方法がよくわかりません。

関連するテーブル/列は次のとおりです。

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
)

編集:この質問に対する最初の 2 つのコメントから、単純な JOIN では十分ではないと考える理由について、十分な情報がないと思うようになりました。テーブル構造を考えると、レシピには 1 つだけでなく複数の材料を含めることができます。つまり、単一のレシピに対して結合を実行しようとすると、次のような結果になります。

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」が 2 回、「Chicken Parmesan」が 5 回表示されます。これは間違いなく私が望むものではありません。すべての成分をカンマで区切って、それぞれを一度表示したいと思います。すなわち:

 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 に答える