【问题标题】:How do I do a multi-table SQL join with grouping如何使用分组进行多表 SQL 连接
【发布时间】:2016-12-15 08:37:02
【问题描述】:

我有三个表,它们在这里由对象表示并转换为 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 计数。

我创建了这个 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

有人可以给我一些关于如何加入的建议吗?

【问题讨论】:

    标签: sql sqlite join


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      相关资源
      最近更新 更多