PHP ARRAY отображает сгруппированные данные из массива на основе диапазонов дат - PullRequest
1 голос
/ 08 февраля 2012

У меня есть этот запрос

$query = mysql_query ("SELECT type, count(*), date FROM tracking WHERE htcode='$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') GROUP BY type, date ORDER BY date ASC");

Этот код:

while ($result = mysql_fetch_assoc($query)){
echo $result['date'] .' / ' .$result['type'].' = ' .$result['count(*)'];
echo '<br>';
}

дает мне:

2012-02-01 / viewed = 2
2012-02-03 / emailed = 1
2012-02-04 / shared = 1
2012-02-05 / viewed = 1
2012-02-07 / viewed = 2
2012-02-07 / shared = 3
2012-02-07 / emailed = 1
2012-02-07 / printed = 1

Как я могу взять массив запросов и вытащить все(просмотрено, отправлено, отправлено по электронной почте, распечатано, использовано) на сегодня, вчера и за диапазон дат (например, последние 30 дней)?

1 Ответ

1 голос
/ 08 февраля 2012

Чтобы получить все результаты для определенного диапазона дат, не группируйте по дате;вместо этого используйте предложение WHERE, чтобы ограничить дату подсчета.В противном случае запрос очень похож.

$query = mysql_query("SELECT type, count(*) FROM tracking WHERE htcode = '$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') AND date >= '$start_date' AND date <= '$end_date' GROUP BY type");

Вот только сам запрос, отформатированный в несколько строк для ясности:

SELECT type, count(*)
FROM tracking
WHERE htcode = '$htG'
  AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used')
  AND date >= '$start_date' AND date <= '$end_date'
GROUP BY type

Просто убедитесь, что вы установили значения для $start_date и $end_date первый.Например, на сегодняшний день вы просто установите их обоих на это:

$start_date = date('Y-m-d');
$end_date = date('Y-m-d');

Обратите внимание, что date('Y-m-d') - это просто сегодняшняя дата в формате, подобном YYYY-MM-DD.

Для вчерашнего дня,вы бы передали вчерашнюю временную метку в функцию date () , но использовали бы тот же формат:

$start_date = date('Y-m-d', strtotime('yesterday'));
$end_date = date('Y-m-d', strtotime('yesterday'));

А в течение последних тридцати дней вы начинали 30 дней назад иконец сегодня:

$start_date = date('Y-m-d', strtotime('30 days ago'));
$end_date = date('Y-m-d');

Вы можете сделать это так для любой даты начала / окончания.Обратите внимание, что я использую strtotime () , что позволяет вам использовать множество английских фраз для указания меток времени вместо необходимости выполнять арифметику дат.

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

function report_range($htG, $start_date, $end_date) {
    $query = mysql_query("SELECT type, count(*) FROM tracking WHERE htcode = '$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') AND date >= '$start_date' AND date <= '$end_date' GROUP BY type");

    while ($result = mysql_fetch_assoc($query)){
        echo $start_date . '-' . $end_date . ' / ' . $result['type'] . ' = '  . $result['count(*)'];
        echo '<br>';
    }
}

Затем запустите ее с чем-то вроде этого (последние 30 дней в этом примере):

report_range($htG, date('Y-m-d', strtotime('30 days ago')), date('Y-m-d'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...