如何使用分组进行多表SQL连接

时间:2016-12-15 08:37:03

标签: sql sqlite join

我有三个表,这些表由对象表示,并转换为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

有人可以就如何加入我的建议吗?

1 个答案:

答案 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。

相关问题