2011-10-12 68 views
1

我有一个分类表和产品表。产品有category_id,也有maker_id。MySQL分组子查询优化

我试图返回一个类别名称的表,以及该类别是否包含属于给定$ maker_id(如在PHP代码中定义的)的任何产品的二进制文件。

我目前的方法计算每个类别有多少匹配产品,但我假设有一个更快的方法,因为我只需要一个是/否。当前代码:

SELECT 
    c.name, 
    SUM(CASE WHEN p.maker_id = '{$maker_id}' THEN 1 ELSE 0 END) AS already_used 
FROM categories c 
LEFT JOIN products p ON p.category_id = c.id 
GROUP BY c.id 

我在阅读使用EXISTS,但我发现所有的例子都在WHERE子句中使用它。谢谢!

+0

您需要更多的产品除了在从'maker_id'任何其他信息? – Naltharial

+0

是的。我正在做另一个类似的计数,其中有多少处于各种“状态”。基本上如下: SUM(作为例子,当p.status ='ready'THEN 1 ELSE 0 END)为ready_count。如果有一种方法可以将这些类型的分组查询组合起来,那就太棒了。 – Charles

回答

1

你可以试试这个:

SELECT c.name,COUNT(1) AS already_used, SUM(IF(p.status = 'ready', 1, 0)) AS ready_count 
FROM categories c 
LEFT JOIN products p 
ON (p.category_id = c.id) 
WHERE p.maker_id = '{$maker_id}' 
GROUP BY c.id;