2016-12-15 8 views
1

ここではオブジェクトで表され、SQLiteテーブルに変換される3つのテーブルがあります。 CategoryGroupテーブルには複数のCategoriesがあり、各Categoryには複数のPhrasesがあります。グループ化を使用して複数テーブルSQL結合を行うには

public class CategoryGroup 
{ 
    [PrimaryKey, NotNull] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool Selected { get; set; } 
} 

public class Category : ICategory 
{ 
    [PrimaryKey, NotNull] 
    public int Id { get; set; } 
    public int CategoryGroupId { get; set; } 
    public string Name { get; set; } 
    public bool Selected { get; set; } 
} 

public class Phrase : IPhrase 
{ 
    public int CategoryId { get; set; } 
    [PrimaryKey, NotNull] 
    public string PhraseId { get; set; } 
    public string English { get; set; } 
    public string Romaji { get; set; } 
    public string Kana { get; set; } 
    public string Kanji { get; set; } 
    public int Modified { get; set; } 
} 

私がしたいのは、これらの3つのテーブルを結合し、それらをCategoryGroupでグループ化し、Selected Countを報告することです。

私はこのSQLを作成しましたが、3つのテーブル結合についてはわかりません。

SELECT CG.Id, CG.Name, COUNT(*) AS PhraseCount 
FROM CategoryGroup AS CG 
FROM Category AS C 
JOIN CG.Id = P.CategoryId 
JOIN Phrase AS P ON C.Id = P.CategoryId 
GROUP BY CG.Id 
ORDER BY CG.Name 

参加方法について教えてもらえますか?

答えて

1

あなたは構文が間違っています。 1つのテーブルから選択し、レコードが一致するようにいくつかの条件で別のレコードを結合し、このテーブルをリンクする他のいくつかの基準で3番目のレコードを結合します。

SELECT CG.Id, CG.Name, COUNT(*) AS PhraseCount 
FROM CategoryGroup AS CG 
JOIN Category AS C ON C.CategoryGroupId = CG.Id 
JOIN Phrase AS P ON P.CategoryId = C.Id 
GROUP BY CG.Id 
ORDER BY CG.Name; 

代わりにGROUP BY CG.Id, CG.Nameが必要な場合があります。カテゴリ・グループ名は機能的にカテゴリ・グループIDに依存しているため、SQL標準では必要ありませんが、一部のDBMSではこれを要求しています(機能的依存性を判断することが難しいため)。私はこの点でSQLiteについて知らない。

関連する問題