2011-03-26 78 views
1

我有两张桌子。名称表有一个名为'categories'的外键。另一个表是包含类别名称的“类别”。名称表引用类别表中的类别。如何在SQL中将两个表连接在一起?

所以我用这个:

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

正如你所看到的,我做两个SELECT语句。我听说加入表可以做魔术,请教我如何在一个SELECT语句中做到这一点。

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

+0

声明1中是否缺少'FROM'?我们可以看到2个表的完整模式吗? – 2011-03-26 21:48:14

回答

3
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 
+0

缺失类别的总数量? – Andomar 2011-03-26 21:10:50

+0

@Andomar - 我正在处理最后一句“基本上我想要从类别表中选择所有行,然后计算名称表中每个类别的实例数。”尽管如此,这是一个令人困惑的问题。 – 2011-03-26 21:11:44

1

你能数名在子查询数量:

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

假设类别表的名称是“分类”(与CATEGORY_NAME和CATEGORY_ID)及名称表的名称是“名称”(带有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 

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

0

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

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

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

如果你有一个1:1的关系,也就是说,每个类别都有一个名字,每个名字都是一个类别,你可以把它们放在一个表中。

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

我想我们需要一些样本数据或更多的解释,以成为一个真正的帮助。

相关问题