Массив для создания дат - PullRequest
       15

Массив для создания дат

0 голосов
/ 10 сентября 2009

Я хочу создать массив с использованием PHP, который можно использовать в MySQL. Мой запрос выглядит так ...

select
    name,
    sum(if (tdate='2009-09-09', amount, 0) as day1,
    sum(if(tdate='2009-09-10', amount, 0) as day2
    ...
    ... 
    sum(if(tdate='2009-10-01', amount, 0) as day23
from revenue
group by name;

Диапазон дат может меняться, но всегда может быть менее 30 дней. Если я введу даты начала и окончания для массива PHP, сможет ли он генерировать запрос, как показано выше?

Ответы [ 2 ]

2 голосов
/ 10 сентября 2009

Вы должны использовать группировку, чтобы сделать это для вас:

SELECT name, DATE(tdate) as d, SUM(amount)
FROM revenue
WHERE d >= NOW() AND d < DATE_ADD(NOW(), 30 DAYS)
GROUP BY name, d

Это даст вам каждую дату в новом ряду вместо нескольких полей в одном ряду, но мы надеемся, что это выполнимое решение для вас.

Я предположил, что tdate это datetime. ДАТА (tdate) преобразует его в просто дату (исключая часть времени). Кроме того, замените предложение WHERE тем диапазоном, который вам необходим.


Редактировать : хорошо, поэтому нам нужно иметь одну строку на имя с таким количеством полей, сколько необходимо. Такая таблица называется «перекрестная таблица», и MySQL не очень хорошо ее поддерживает, но вы определенно можете взломать ее вместе. Смотрите здесь для получения дополнительной информации: http://rpbouman.blogspot.com/2005/10/creating-crosstabs-in-mysql.html

Однако, если даты известны заранее, не составит труда использовать PHP, чтобы сложить все вместе.

// get this list in whichever way you wish
$dates = array("2009-09-09", "2009-09-10", "2009-09-11");

$sql = "SELECT name, "
     . "sum(if (tdate='"
     . implode("', amount, 0), sum(if (tdate='", $dates)
     . "', amount, 0)"
     . "FROM revenue "
     . "GROUP BY name";
0 голосов
/ 10 сентября 2009

Если вы хотите сгенерировать показанный запрос, вы можете использовать функцию даты в PHP, чтобы помочь сгенерировать строку:

$dateString1 = date("Y-m-d", $date);
$dateString2 = date("Y-m-d", $date2);
$sql = "select
           name,
           sum(if (tdate='$dateString1', amount, 0) as day1,
           sum(if (tdate='$dateString2', amount, 0) as day2
         from revenue
         group by name;";
// Run the query as usual...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...