Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Число клиентов, сделавших 2 и более заказов (всего)

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
biperch
Отправлено: 27 Сентября, 2012 - 16:59:57
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


Помог: 8 раз(а)




нужно сделать запрос выборки количества клиентов сделавших 2 и более заказов, общее количество клиентов это я запросто, а вот хотят что бы выводилось по дням и неделям, то есть по нарастающей
6-6-2012 5
7-6-2012 8
8-6-2012 10

таблица заказов uc_orders
order_id - номер заказа
uid - id пользователя
created - дата создания

есть еще поля но они не имеют к этому отношения
таблица date
поле то date ))

есть еще вспомогательная таблица в которой просто по порядку идут даты, относительно которой выстраивается статистика, из за того что иногда бывают дни когда для одной статистики нет данных и запрос выводит данные без этого дня, а потом другой запрос выводит данные у которых другие дни отсутствуют и потом ничего не сходится, а так если день пропущен то просто пустота получается при Left join когда нет данных
есть вот такой вот запрос из последних вариантов который не дает результата который я хочу и реально губителен))) для производительности,

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT d.date,  FROM_UNIXTIME(o.created, '%Y-%m-%d') AS created, o.uid,  count(o.uid) FROM  uc_orders o
  2. LEFT JOIN date AS d ON FROM_UNIXTIME(o.created, '%Y-%m-%d') = DATE(d.date)
  3. WHERE
  4. o.order_status <> 'canceled' AND
  5. o.created > UNIX_TIMESTAMP('2012-06-06 00:00:00') AND
  6. o.uid <> 0 AND
  7. o.uid IN (SELECT oo.uid FROM uc_orders oo WHERE oo.created > UNIX_TIMESTAMP('2012-06-06 00:00:00') AND oo.order_status <> 'canceled' AND FROM_UNIXTIME(o.created, '%Y-%m-%d') <= DATE(d.date)  GROUP BY oo.uid HAVING COUNT(oo.order_id)>1)
  8. GROUP BY d.date


как я себе представляю это должно работать:
проходим по датам после делается выборка проверка по заказам у кого есть 2 заказа и более но при этом дата заказа должна быть менmше или равна дате из первой таблицы date
 
 Top
Мелкий Супермодератор
Отправлено: 27 Сентября, 2012 - 17:08:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А что за таблица date?

Как-то так, например:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT FROM_UNIXTIME(o.created, '%Y-%m-%d') AS `date`, count(0) AS `userscount` FROM uc_orders o JOIN (
  2. SELECT uid FROM uc_orders GROUP BY uid HAVING count(0)>=2
  3. ) users USING(uid)
  4. GROUP BY 1


-----
PostgreSQL DBA
 
 Top
biperch
Отправлено: 27 Сентября, 2012 - 17:18:49
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


Помог: 8 раз(а)




date там просто даты по порядку, что бы несколько десятков результатов запросов можно было в экселе вывести и они по дням совпали
(Добавление)
Мелкий ваш запрос вернул
2012-04-13 1
2012-04-16 4
2012-04-17 2
2012-04-18 9
2012-04-19 7
2012-04-20 4
2012-04-22 2

и таблица date для того что бы в днях не было пропусков

а нужно про суммировать, что бы в каждом следующем дне были те у кого второй заказ произошел в этот день и плюс все те кто раньше, тое сть накопление с сумированием как бы

(Отредактировано автором: 27 Сентября, 2012 - 17:28:40)

 
 Top
biperch
Отправлено: 27 Сентября, 2012 - 21:40:56
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


Помог: 8 раз(а)




не совсем то но пойдет
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT date(date), count(oo.c) FROM date AS d
  2. LEFT JOIN (SELECT FROM_UNIXTIME(MAX(o.created), '%Y-%m-%d') AS c, uid FROM uc_orders o
  3. WHERE
  4. o.order_status <> 'canceled' AND
  5. o.uid <> 0 AND
  6. o.created  > UNIX_TIMESTAMP('2012-06-06 00:00:00')
  7. GROUP BY o.uid
  8. HAVING
  9. count(0)=2) oo ON oo.c <= DATE(d.date)
  10. GROUP BY d.date



вывод
2012-06-06 0
2012-06-07 1
2012-06-08 1
2012-06-09 2
2012-06-10 2
2012-06-11 2
2012-06-12 2
2012-06-13 2
2012-06-14 2
2012-06-15 2
2012-06-16 2
2012-06-17 2
2012-06-18 2
2012-06-19 2
2012-06-20 3
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB