【问题标题】:How to join two tables together in SQL?如何在 SQL 中将两个表连接在一起?
【发布时间】:2011-03-26 21:03:20
【问题描述】:

我有两张桌子。名称表有一个名为“类别”的外键。另一个表是包含类别名称的“类别”。名称表引用类别表中的一个类别。

所以我用这个:

$categories = "SELECT name, COUNT(*) category";
$number_of_categories = "SELECT category, COUNT(1) FROM name GROUP BY category";

如您所见,我正在执行两个选择语句。我听说加入表可以变魔术,请教我如何在一个 SELECT 语句中做到这一点。

基本上我想从类别表中SELECT所有行,然后统计名称表中每个类别的实例数。

【问题讨论】:

  • 声明 1 中是否缺少 FROM?我们可以看到 2 个表的完整架构吗?

标签: mysql sql


【解决方案1】:
SELECT c.name, COUNT(n.category) AS count_in_name_table
FROM categories c
LEFT JOIN name n ON n.category = c.name
GROUP BY c.name

【讨论】:

  • 缺少类别总数?
  • @Andomar - 我正在处理最后一句“基本上我想从类别表中选择所有行,然后计算名称表中每个类别的实例数。”这是一个有点令人困惑的问题。
【解决方案2】:

假设类别表的名称是“Category”(带有category_name和category_id),名称表的名称是“Name”(带有name_id和category_id):

SELECT C.category_name, COUNT(N.name_id) FROM Category C 
LEFT JOIN Name N ON C.category_id=N.category_id
GROUP BY C.category_name

分组允许您计算每个类别名称的所有名称条目。

【讨论】:

    【解决方案3】:

    您可以计算子查询中名称的数量:

    select  category.name
    ,       (
            select  count(*)
            from    category
            ) as CategoryCount
    ,       (
            select  count(*)
            from    name
            where   name.category = category.name
            ) as NameCount
    from    category
    

    【讨论】:

      【解决方案4】:

      你可能有一个糟糕的设计。

      • 名称表有一个外键“类别”。
      • “类别”表包含类别名称。
      • 名称表引用了类别表中的一个类别。

      两个表是否相互引用?或者它只是通用名称“名称”和“类别”的结果?

      如果您有1:1 关系,这意味着每个类别都有一个名称,每个名称都是一个类别,您可以将它们放在一个表中。

      如果您有1:n 关系,一个类别绑定到多个名称,则该关系将在类别表中指定。如果是n:1 关系,则反之。

      我想我们需要一些示例数据或更多解释,才能提供真正的帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-11
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多