2013-07-10 1 views
1

Это запрос, я использую на product таблице LEFT JOIN на page таблице ONproductid колонны в page будучи id в product .. довольно просто.SQL запрос ResultSet, мне нужно SUM (количество) COLUMN, сгруппированные по DAY

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 

Теперь мой ResultSet выглядит следующим образом:

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 с десятью или более page сгруппированы по 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` 

Благодаря другу моего сотрудника Daniël Versteeg

1

Я думаю, что это потому, что вы уезжаете p.id в пункте group by. Попробуйте это:

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 BY значение id, а также ORDER BY может быть day слишком

Обратите внимание, что day не доступен в GROUP BY в стандарте SQL или при 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