2010-06-06 48 views
1

我在我的应用程序中有以下查询。它运行良好,但我需要它也包含与每个制造商相关的产品数量。mySQL:加入三张表 - 如何?

当前查询:

SELECT * FROM (`manufacturers`) 
JOIN `languages` ON `manufacturers`.`lang` = `languages`.`id` 
ORDER BY `languages`.`id` asc, `id` asc 

我的产品表看起来像这样:

id | name | manufacturerid 
0  | Product1 | 0 

回答

3
SELECT `manufacturers`.*, `languages`.*, COUNT(`products`.`id`) AS NumberOfProducts 
FROM (`manufacturers`) 
JOIN `languages` ON `manufacturers`.`lang` = `languages`.`id` 
LEFT OUTER JOIN `products` ON 
     `products`.`manufacturerid` = `manufacturers`.`manufacturerid` 
GROUP BY <Column list for manufacturers AND languages here> 
ORDER BY `languages`.`id` asc, `manufacturers`.`id` asc 
+0

我在这个标记上的标记太慢了,但又是一个选项! – 2010-06-06 16:11:16

+0

您好Martin,您能解释一下“<制造商和语言的列表列表>”吗? – Industrial 2010-06-06 16:46:54

+0

@Industrial因为你只有'*'在你的选择中,我无法知道它们是什么。 SELECT列表中不是聚合或文字的任何内容都应在“GROUP BY”子句中。我认为MySQL允许它们不成为,但这会改变查询的语义。 – 2010-06-06 17:06:18

3
select * 
from `manufacturers` m 
inner join `languages` l on m.`lang` = l.`id` 
left outer join (
    select manufacturerid, count(*) as ProductCount 
    from Products 
    group by manufacturerid 
) pc on m.id = pc.manufacturerid 
order by l.`id` asc, m.`id` asc 
+0

嗨!使用解决方案时出现以下错误: 错误号:1096未使用任何表SELECT * ORDER BY'languages'.''' asc,'manufacturerrid' asc – Industrial 2010-06-06 17:08:40

+1

发布您的模式。 – RedFilter 2010-06-06 17:12:36

+0

没关系OrbMan,我有一个查询,直接导致此错误后运行。对不起,并且非常感谢您的帮助! – Industrial 2010-06-06 17:26:30