Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2012, 15:55   #1
Unmanner
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 47
Хорошо Хочу написать нормальные запросы

Здравствуйте уважаемые коллеги!

Сразу к делу, ситауция такая, есть скрипт для сбора данных по статистике партнёрской программы.

Таблицы такие:
shopaffiliate - поля: id, name, ...
shopaffiliate_statistic - поля: affiliate_id, ip, datetime

Все с виду просто, нужно придумать запрос который будет давать данные для графика в зависимости от поставленного запроса пользователя:
- за неделю (все просмотры/уникальные)
- за месяц (все просмотры/уникальные)
- за квартал (все просмотры/уникальные)
- за год (все просмотры/уникальные)

ещё один интересный момент, если пользователь попросит строить за год к примеру, не собирать же статистику по 265 дням отдельно? Как-то наверное это обычно усредняется?

Примеры того что написал я:
Для недели (все просмотры)
PHP код:
for ($i=0;$i<6;$i++)
    {
        
$q_week 'SELECT * FROM `shopaffiliate_statistic` WHERE
`datetime` >= (CURDATE()-'
.$i.'-1) AND
`datetime` < (CURDATE()-'
.$i.') AND
`affiliate_id` = "'
.mysql_escape_string($_GET["a_id"]).'";';
.... 
Для недели уникальные:
PHP код:
$q_week_ip 'SELECT * FROM `shopaffiliate_statistic`
WHERE `datetime` >= CURDATE() AND
`affiliate_id` = "'
.mysql_escape_string($_GET["a_id"]).'" GROUP BY `ip`;';
    
    
$res_week_ip  mysql_query($q_week_ip);
    
$num_week_ip mysql_num_rows($res_week_ip);

    for (
$j=0$j<$num_week_ip$j++)
    {
        
$row_week_ip   mysql_fetch_row($res_week_ip);
        
$data_ip[6] += 1;
    }
.... 
Просто если я буду продолжать делать дальше в том же духе то боюсь что это очень просадит производительность, хотелось бы сделать это оптимальнее.

Еще хочу оптимизировать формирования топа партнёров, его нужно формировать как по общему доходу человека так и по уникальным показам.

Подскажите?
Unmanner вне форума Ответить с цитированием
Старый 13.12.2012, 20:55   #2
Dexes
Пользователь
 
Регистрация: 27.12.2011
Сообщений: 86
По умолчанию

Можно как то структуру БД попонятней отрисовать? Лучше в JPG приложить со связями и ключами даже.
Про "запрос за неделю (месяц/год)" запросы за последнюю неделю (месяц/год) или же выбранные пользователем?

ADD

SQL может быть такой

$q_week_ip = '
SELECT count(ip) as all_show, ip
FROM shopaffiliate_statistic
WHERE datetime BETWEEN date( now() ) - interval 1 day AND now()
AND affiliate_id = "'.mysql_escape_string($_GET['a_id']).'"
GROUP BY ip';

Количество строк этого запроса - это количество уникальных показов.
В all_show будет выводиться количество показов для IP, сумма по всему all_show даст общее количество показов.
Это будет работать если я структуру верно понял.
Про интервалы
- (или +) INTERVAL 6 DAY
- INTERVAL 7 WEEK
- INTERVAL 100500 YEAR
И так далее.

Последний раз редактировалось Dexes; 13.12.2012 в 21:16.
Dexes вне форума Ответить с цитированием
Старый 14.12.2012, 10:22   #3
Unmanner
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 47
По умолчанию

Отличгый запрос, с виду подходит для построения статистики
Да, имелось ввиду за последний (год/неделю/месяц)

Вот структура таблиц:

shopaffiliate


shopaffiliate_statistic


shopaffiliate_transaction



Хотелось бы ещё использовать объединение таблиц, чтобы за раз выдавать: и количество уникальных/всех просмотров так и количество $ полученных из таблици с транзакциями.
Unmanner вне форума Ответить с цитированием
Старый 14.12.2012, 12:45   #4
Dexes
Пользователь
 
Регистрация: 27.12.2011
Сообщений: 86
По умолчанию

Код:
$q_week_ip = '
SELECT count(ip) as all_show, ip
FROM shopaffiliate_statistic
    INNER JOIN shopaffiliate ON shopaffiliate.affiliate_id = shopaffiliate_statistic.affiliate_id
WHERE datetime BETWEEN date( now() ) - interval 1 day AND now()
AND affiliate_id = "'.mysql_escape_string($_GET['a_id']).'"
GROUP BY ip';
INNER JOIN спасет. Ну и shopaffiliate_transaction можно прицепить аналогично
Просто после одного INNER JOIN table ON <условие> написать еще один INNER JOIN по той же схеме
Это при учете что 1 к 1му всё (что конечно врят ли)
Если же нет можно за 2 SQL всё выцепить
Обработали сначала первый запрос, накопили affiliate_id в массив
Далее

Код:
$sql = 'SELECT *
FROM shopaffiliate_transaction
WHERE affiliate_id in ('.implode(',', $ids).')';
Где $ids - массив идентификаторов affiliate_id
Как то так.

Последний раз редактировалось Dexes; 14.12.2012 в 12:49.
Dexes вне форума Ответить с цитированием
Старый 14.12.2012, 13:33   #5
Unmanner
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 47
По умолчанию

Класс, спасибо большое

А то скрипт моей партнерки уж очень невзрачен был, теперь проапгрейдим!
Unmanner вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите написать sql запросы student223 SQL, базы данных 8 16.05.2012 14:41
Хочу написать кейлогер wwe2012 Общие вопросы C/C++ 18 31.03.2011 07:56
Написать запросы xbarmaleyx SQL, базы данных 1 27.03.2011 15:49
Хочу написать 3D-движок qazar Помощь студентам 1 10.02.2011 15:51