2011-10-04 133 views
0

我有两个表1.category 2.产品表。我想要一个类别下的总产品,一个作者类别下的总子产品,最后在产品下创建产品或子产品以及创建日期。优化MySQL查询

我的查询工作象下面这样:

SELECT c.category_id,c.title,c.type,c.alias, 
    (SELECT COUNT(product_id) 
    FROM products 
    WHERE parent_type='main' 
    AND category_id=c.category_id 
    AND is_active=1 
    ) as total_main_products, 
    (SELECT count(product_id) 
    FROM products 
    WHERE parent_type IN('subtypeL1','subtypeL2','subtypeL3') 
    AND category_id=c.category_id 
    AND is_active=1 
    ) as total_sub_products, 
    DATE_FORMAT(
     (SELECT FROM_UNIXTIME(created) as update_time 
     FROM products 
     WHERE parent_type='main' 
     AND category_id=c.category_id 
     ORDER BY update_time desc limit 1 
     ),'%b %d,%Y at %r' 
    )as last_updated, 
    (SELECT user_id 
    FROM products 
    WHERE parent_type='main' 
    AND category_id= c.category_id 
    ORDER BY created desc limit 1 
    ) as updated_by 
FROM category c 
WHERE c.type=1 
AND c.is_active=1 
ORDER BY c.created DESC 

寻找的讨论,这是正确的&有效的方式来编写查询或我们有任何其他方式来获得相同的result.I试图JOIN的选择,但没有返回正确的结果。

任何帮助或建议将大大appriciated。

感谢

+1

要有**得到帮助的任何**的希望,你要格式化您的查询 - 得到一些换行和在那里缩进 – Bohemian

+0

我第二@Bohemian。我已经做了一些免费的格式化。下一次我会寄给你账单;) – Romain

+0

谢谢@Bohemian&Romain – coder

回答

0

像这样(没有最后updated_by场) -

SELECT c.category_id, c.title, c.type, c.alias, 
    COUNT(IF(p.parent_type='main' AND p.is_active = 1, p.product_id, 0)) total_main_products, 
    COUNT(IF((p.parent_type='subtypeL1' OR p.parent_type='subtypeL2' OR p.parent_type='subtypeL3') AND p.is_active = 1, p.product_id, 0)) total_sub_products, 
    FROM_UNIXTIME(MAX(IF(p.parent_type='main', update_time, 0))) last_updated -- add formatting here 
FROM category c 
    LEFT JOIN products p 
    ON p.category_id = c.category_id 
WHERE 
    c.type = 1 AND c.is_active = 1 
GROUP BY 
    p.category_id 
ORDER BY 
    c.created DESC 
+0

你好,谢谢你的回复,但是这个查询返回错误的结果,因为我的其他JOIN查询正在返回 – coder

+0

请告诉你什么是错的。提供表格定义,小数据集和所需结果的示例。 – Devart