3

だから、私はそのコードでMySQLからいくつかのデータを取得しています:

<?
$query=mysql_query("SELECT date,COUNT(*) as num FROM downloads WHERE prjID='".$_GET['id']."' GROUP BY date ORDER BY date ASC");
$num=mysql_num_rows($query);
$res='';
$i=0;
while($row=mysql_fetch_array($query)){

$i++;
$date=date("d.m.Y", strtotime($row['date']));

$dan=date("d", strtotime($row['date']));
$mesec=date("m", strtotime($row['date']));
$leto=date("Y", strtotime($row['date']));

if($i=1){
$danPrvi=$leto.", ".($mesec-1).", ".$dan;
$dan1=date("d", strtotime(time()));
$mesec1=date("m", strtotime(time()));
$leto1=date("Y", strtotime(time()));
$danZadnji=$leto1.", ".($mesec1-1).", ".$dan1;
}

$numb=1;

if($row['num']!=1){
$res.="[Date.UTC(".$leto.",".($mesec-1).",".$dan."),".$row['num']."], ";
}
else{
if($i!=$num){
$res.="[Date.UTC(".$leto.",".($mesec-1).",".$dan."),".$numb."], ";
}
else{
$res.="[Date.UTC(".$leto.",".($mesec-1).",".$dan."),".$numb."]";
}
}
}
?>

そして、次のような結果が得られます。

1.3.2013 - 1
6.3.2013 - 5

しかし、私はそのような結果を得たいと思っています:

1.3.2013 - 1
2.3.2013 - 0
3.3.2013 - 0
4.3.2013 - 0
5.3.2013 - 0
6.3.2013 - 1

ハイチャートも使用しているため、日付の値は Date.UTC(year, month-1, day) のようにフォーマットする必要があります

編集:

データベースにすべての日付があるわけではありません。私の例では、1.3.2013 と 6.3.2013 しかないので、値 >=1 を持たないすべての日付を検出して 0 の値を設定するにはどうすればよいでしょうか?

4

3 に答える 3

4

あなたがする必要があるのは、興味のある日付を保持する構造を設定し、それをクエリで使用するか、クエリデータを後処理することだと思います。例えば:

<?php
$query=mysql_query("SELECT date,COUNT(*) as num FROM downloads WHERE prjID='".$_GET['id']."' GROUP BY date ORDER BY date ASC");
$num=mysql_num_rows($query);

// Get the first and last dates in the result set
$firstRow = mysql_result($query, 0);
$lastRow = mysql_result($query, $num-1);

// Now make thos the begin and end dates
$beginDate = new DateTime(strtotime($firstRow['date']));
$endDate = new DateTime(strtotime($lastRow['date']));
$currentDate = $beginDate;
$interestingDates = array();

// Populate our interestingDates array with all counts set to 0
while ($currentDate <= $endDate){
    $interestingDates[$currentDate->format('d.m.Y')] = 0;
    $currentDate->add(new DateInterval('P1D'));
}

// Reset the data result for looping over
mysql_data_seek($query,0);
while($row=mysql_fetch_array($query)){
    // Go ahead and format the string
    $formatedString = date("d.m.Y", strtotime($row['date']));

    // If the string is in our interestingDates array, update the count
    if (array_key_exists($formatedString, $interestingDates)){
        $interestingDates[$formatedString] = $row['num'];
    }
}

// Print it out
foreach ($interestingDates as $key=>$value){
    print "$key - $value\n";
}

注 1: mysql_query は PHP 5.5.0 で非推奨になり、将来削除される予定です。別の API を使用してください - pdo_mysqlをお勧めします。

注 2: 現在のクエリはパラメーター化されていません。PDO を使用すると、これはおそらく次のようになります。

$sth = $dbh->prepare('SELECT date,COUNT(*) as num FROM downloads WHERE prjID= :prjID GROUP BY date ORDER BY date ASC');
$sth->bindParam(':prjID', $_GET['id'], PDO::PARAM_INT);
$sth->execute();

免責事項- 私は実際にこのコードを実行したわけではなく、頭のてっぺんから書いただけです。テスト/デバッグが必要になる場合があります。

于 2013-03-29T14:02:19.417 に答える
0

特定のIDだけでなく、すべての日付のデータがあると仮定すると、条件の合計を実行できます。

SELECT date, sum(case when prjID='".$_GET['id']."' then 1 else 0 end) as num
FROM downloads
GROUP BY date
ORDER BY date ASC
于 2013-03-29T13:54:44.267 に答える
0

警告!SQLでそれを行うのは非常に悪いスタイルですが、必要に応じて-できます:)

http://sqlfiddle.com/#!2/b491a/1/0

SELECT dynamic_date AS date, COUNT(downloads.date) AS num FROM (
    SELECT DATE_ADD(start, INTERVAL i - 1 DAY) AS dynamic_date, prjID FROM
      (
        SELECT @i := @i + 1 AS i FROM 
        (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
        (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
        (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
        (SELECT @i:=0) init
      ) i_sequence,
      (SELECT MIN(date) start, MAX(date) finish, prjID FROM downloads WHERE prjID=5 GROUP BY prjID) minmax
    WHERE DATE_ADD(start, INTERVAL i - 1 DAY) <= finish
) date_sequence
LEFT JOIN downloads ON dynamic_date = downloads.date and downloads.prjID=date_sequence.prjID
GROUP BY dynamic_date
;
于 2013-03-29T15:42:39.190 に答える