我有三个表,这些表由对象表示,并转换为SQLite表。 CategoryGroup
表有多个Categories
,每个Category
有多个Phrases
。
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; }
}
我想要做的是加入这三个表并按CategoryGroup对它们进行分组,然后报告Selected count。
我创建了这个SQL,但我不确定三个表连接。
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
有人可以就如何加入我的建议吗?
答案 0 :(得分:1)
您的语法错误。您可以从一个表中选择,在某些条件上加入另一个表以便记录匹配,然后在链接此表的其他一些条件上加入第三个。
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
。这不是SQL标准所必需的,因为类别组名称在功能上依赖于类别组ID,但是一些DBMS要求这样做(因为它们发现它太难以确定功能依赖性)。在这方面我不了解SQLite。