2

大規模な選択ステートメントまたは複数のクエリが必要です。日中のデータを特定の時間枠に分割する必要があります。これは最初の間隔ではうまく機能しますが、その後は困惑します。複数のクエリがある場合、構文に関して「mysql_fetch_array」に問題があります(「else」などを使用してそれらを調べます)。

SELECT U.user_name,ROUND(SUM((TA.task_average*TC.completed)/60),2) AS equiv1, S.submit_date,
    SUM(TC.completed) AS ttasks1,
    FROM `summary` S
    JOIN users U ON U.user_id = S.user_id
    JOIN tasks TA ON TA.task_id = S.task_id
    JOIN tcompleted TC ON TC.tcompleted_id = S.tcompleted_id
    JOIN minutes M ON M.minutes_id = S.minutes_id
    WHERE DATE(submit_date) = curdate( )
      AND TIME(submit_date) BETWEEN '06:00:00' and '07:59:59'       
      GROUP BY U.user_name
    LIMIT 0 , 30

私のフェッチ配列(もっとたくさん必要ですが、それらを組み合わせるにはどうすればよいですか?)

<?php
while($rows=mysql_fetch_array($result1)){

?>
4

2 に答える 2

3

わかりました、定期的な 2 時間間隔でデータが必要な場合は、次のようなことを試すことができます。

SELECT FLOOR(hour(S.submit_date)/2)*2, U.user_name,ROUND(SUM((TA.task_average*TC.completed)/60),2) AS equiv1, S.submit_date
    SUM(TC.completed) AS ttasks1,
    FROM `summary` S
    JOIN users U ON U.user_id = S.user_id
    JOIN tasks TA ON TA.task_id = S.task_id
    JOIN tcompleted TC ON TC.tcompleted_id = S.tcompleted_id
    JOIN minutes M ON M.minutes_id = S.minutes_id
    WHERE DATE(submit_date) = curdate( )
      GROUP BY U.user_name, FLOOR(hour(S.submit_date)/2)
    LIMIT 0 , 30

whereFLOOR(hour(S.submit_date)/2)*2は、各時間を 2 ごとの最初の (偶数) 時間にマップし、この値でグループ化できます。すなわち。

0, 1 -> 0
2, 3 -> 2
4, 5 -> 4
etc...

含まれているphpで更新:

いくつかのメモ:

  • 私はmysqliを使用しました
  • hours時間間隔に「ギャップ」がないことを確認するために、元のクエリを派生テーブルに結合したままにしました(6:00 - 20:00 と想定)
  • で注文したuserので、結果をループして、特定のユーザーの表のセルを印刷し、ユーザーが変更されたときに新しい表の行を印刷できます。

コードは次のとおりです。

echo '<table border=1><tr><td></td>';
for ($i=6; $i<=18; $i=$i+2) {
    echo '<td colspan=2>'.$i.' - '.($i+2).'</td>';
}

$mysqli = new mysqli('MY_HOST', 'MY_USER', 'MY_PASSWORD', 'MY_DATABASE');

$sql = "
SELECT user_name, IFNULL(equiv1,0) AS equiv1, IFNULL(ttasks1,0) AS ttasks1, hour
FROM
(
    SELECT 6 AS hour
    UNION SELECT 8
    UNION SELECT 10
    UNION SELECT 12
    UNION SELECT 14
    UNION SELECT 16
    UNION SELECT 18
) hours LEFT JOIN

(
SELECT FLOOR(hour(S.submit_date)/2)*2 as task_hour, U.user_name, ROUND(SUM((TA.task_average*TC.completed)/60),2) AS equiv1, S.submit_date
    SUM(TC.completed) AS ttasks1
    FROM `summary` S
    JOIN users U ON U.user_id = S.user_id
    JOIN tasks TA ON TA.task_id = S.task_id
    JOIN tcompleted TC ON TC.tcompleted_id = S.tcompleted_id
    JOIN minutes M ON M.minutes_id = S.minutes_id
    WHERE DATE(submit_date) = curdate( )
      GROUP BY U.user_name, FLOOR(hour(S.submit_date)/2)
    LIMIT 0 , 30
) task_summary
ON hours.hour = task_summary.task_hour
ORDER BY user_name, hour
";

$result = $mysqli->query($sql);

$user_name = '';
while ($row = $result->fetch_assoc()) {
    if ($user_name <> $row['user_name']){
        echo '</tr><tr><td>'.$row['user_name'].'</td>'; //start a new row if user changes
        $user_name = $row['user_name']; //update user variable for checking on next iteration
    }
    echo '<td>'.$row['equiv1'].'</td>';
    echo '<td>'.$row['ttasks1'].'</td>';
}

echo '</tr><table>';
于 2012-10-23T10:01:31.057 に答える
1

これは、「フェッチ配列を組み合わせる方法」という質問に関するものです。以下のように、フェッチ配列からのすべての値を格納する配列を用意しないでください。

<?php
$customArray = array();
while($rows=mysql_fetch_array($result1)){

    $customArray['field1'] = $row['field1'];
    $customArray['field2'] = $row['field2'];

}

//another fetch array

while($rows=mysql_fetch_array($result2)){

    $customArray['field1'] = $row['field1'];
    $customArray['field2'] = $row['field2'];

}

//now $customArray will have all the required values you need. 
//This is not a great option as it is making the logic expensive. 
//Are you going to use this in a cron job ?
?>
于 2012-10-22T15:37:15.363 に答える