2013-07-10 31 views
1

这个分组SUM(数量)列的查询我使用的productLEFT JOINpageONproductidpage正在productid ..很简单。SQL查询结果集,我需要在今天

SELECT 
COUNT(DISTINCT `p`.`id`) as `quantity`, 
DATE_FORMAT(`p`.`created_time`,'%Y-%m-%d') AS `day` 
FROM 
`product` AS `p` 
LEFT JOIN 
`page` AS `pg` ON `p`.`id` = `pg`.`productid` 
WHERE 
`p`.`created_time` BETWEEN '2013-07-03 00:00:00' AND '2013-07-10 23:59:59' 
AND 
`p`.`group` = '101' 
GROUP BY `day`, `p`.`id` HAVING COUNT(`pg`.`productid`)>=10 
ORDER BY `p`.`created_time` 

涉及的两个示例表:

**product** 
id created_time 
32 2013-07-09 
33 2013-07-09 

**page** 
id productid 
1 33 
2 33 
.. .. 
20 33 
21 32 
22 32 
.. .. 
54 32 

现在我的结果集是这样的:

quantity day 
1   2013-07-09 
1   2013-07-09 
1   2013-07-10 

但我想下面的输出,而不UNION,并且不使用temp表:

quantity day 
2   2013-07-09 
1   2013-07-10 

现在我的代码示例中最上面添加了两个表格。我需要的product数量与day

回答

1

我找到了解决我的查询:

SELECT 
COUNT(`p`.`id`) as `quantity`, 
DATE_FORMAT(`p`.`created_time`,'%Y-%m-%d') AS `day` 
FROM 
`product` AS `p` 
INNER JOIN 
(
SELECT 
    `productid` AS `id`, 
    count(id) AS pagesNR 
FROM 
    `page` 
GROUP BY 
    `productid` HAVING COUNT(`id`) >= 10 
) 
AS 
`pg` USING (`id`) 
WHERE 
    `p`.`created_time` BETWEEN '2013-07-03 00:00:00' AND '2013-07-10 23:59:59' 
AND 
    `p`.`group` = '101' 
GROUP BY 
    `day` 
ORDER BY 
    `created_time` 

感谢我的同事丹尼尔Versteeg

1

分组我认为这是因为你的group by子句中留下p.id十个或更多page。试试这个:

SELECT COUNT(DISTINCT `p`.`id`) as `quantity`, 
     DATE_FORMAT(`p`.`created_time`,'%Y-%m-%d') AS `day` 
FROM `product` AS `p` LEFT JOIN 
    `page` AS `pg` 
     ON `p`.`id` = `pg`.`productid` 
WHERE `p`.`created_time` BETWEEN '2013-07-03 00:00:00' AND '2013-07-10 23:59:59' 
     AND `p`.`group` = '101' 
GROUP BY `day` 
HAVING COUNT(`pg`.`productid`)>=10 
ORDER BY `p`.`created_time` 
+0

非常接近人的朋友,但我需要10页或更多页的数量总和..在你的答案中,结果集包括的产品也少于10页。 – Theo

+0

感谢您的努力@MaxiWheat和Gordon Linoff – Theo

1

不要GROUP BYid值,也是ORDER BY可以在day

注意day不是在标准SQL的GROUP BY或当sql_mode is using "only_full_group_by"可用。 MySQL允许它作为一个扩展,但它是一种误导

SELECT 
    COUNT(*) as `quantity`, 
    DATE_FORMAT(`p`.`created_time`,'%Y-%m-%d') AS `day` 
FROM 
    `product` AS `p` 
    JOIN 
    `page` AS `pg` ON `p`.`id` = `pg`.`productid` 
WHERE 
    `p`.`created_time` BETWEEN '2013-07-03 00:00:00' AND '2013-07-10 23:59:59' 
    AND 
    `p`.`group` = '101' 
GROUP BY 
    `pg`.`productid`, DATE_FORMAT(`p`.`created_time`,'%Y-%m-%d') AS `day` 
HAVING 
    COUNT(*) >= 10 
ORDER BY 
    `day`; 
+0

非常接近的家伙(),但我需要的数量总和有10页或更多页..在您的答案中,结果集包括少于10页的产品。 – Theo

+0

@Theo:修正JOIN和COUNT以符合您的要求 – gbn

+0

我的查询只返回一行'HAVING'同一产品的10页或更多页面,您的解决方案可以解决每个产品的一天总计问题。 – Theo