1

データベースに次の構造のテーブルエントリがあります。

id | card | event | time | day | hm
  • > id-各エントリの一意のIDです。
  • >カード-は番号です。
  • >イベント-は番号(0、1、2、または3)です
  • >時間-mysql_timestampです
  • >-エントリが追加された日です(date( "j"、time())
  • > hm-その他の情報...

1か月間のすべてのエントリをhtmlテーブルに表示したい。今、私はこの単純なクエリを使用しています:

$sql = "SELECT event, time, day, hm FROM `entries` 
WHERE card=$card_t 
AND YEAR(time)=$year 
AND MONTH(time)=$month
AND event IN (0,1,3) 
ORDER BY `time` ASC;";

出力の条件:テーブルには、1日あたり最低1行(1月は31行)が必要です。day(1-31)行のエントリがない場合は、次のようにする必要があります。日行のエントリが2つしかない場合は、次のようにする必要があります。

<tr>
   <td>$day_number</td>
   <td>$time_of_first_event</td>
   <td>$first_event</td>
   <td>$time_of_last_event</td>
   <td>$last_event</td>
 </tr>

 if there is more than two entries a day two must be (I will hide second one with jquery later):

  <tr>
   <td>$day_number</td>
   <td>$time_of_first_event</td>
   <td>$first_event</td>
   <td>$time_of_last_event</td>
   <td>$last_event</td>
 </tr>
 <tr>
     <table>
       <tr>
        <td>$time</td>
        <td>$event</td>
       </tr>
     </table>
 </tr>

したがって、次のようになります。

| 1 | no entry                                          |
| 2 | no entry                                          |
| 3 | no entry                                          |
| 4 | time_first | event_fisrt | time_last  |event_last |
                 | time2 | event 2                      |
                 | time3 | event 3                      |
| 5 | no entry                                          |
... 

しかし、私が今得たのは31行の出力であり、ある日がそれよりも多い場合、この日の行を複製し、この日のすべての行を表示します。

| 1 | no entry       |
| 2 | no entry       |
| 3 | no entry       |
| 4 | time1 event 1  |
| 4 | time2 event 2  |
| 4 | time3 event 3  |
| 5 | no entry       |
...

私を助けてください、そして間違いをお詫びします、英語は私の母国語ではありません。

4

2 に答える 2

0

私があなたを正しく理解していれば、あなたは出力をグループ化したいと思います。そして、グループを構築するための基準は日付です。1つの方法は、ループの前に変数を定義することです。この変数には、最後に処理されたエントリの日付が格納されます。そして、エントリを出力する前に、エントリの日付がこの変数と同じであるかどうかを確認します...その後、グループ内にいるので、別の方法で出力する必要があります。

あなたの場合、あなたの非常に特別な出力フォーマットのためにこれを達成するのは少し難しいかもしれません。最初にクエリ結果をループして、日付が最初のレベルのキーである多次元配列にエントリを格納し、次のレベルにこの日付に関連するすべてのエントリを格納する方が簡単な場合があります。だからあなたは得る:

array (
   'xxxx-xx-xx' => array(entry1, entry2, entry3),
   'yyyy-yy-yy' => array(entry1),
   ...
)

次に、この配列に対して別のループを実行しif (count($array[$currentKey]) == 1)、この日付またはそれ以上のイベントが1つしかないかどうかを確認するために使用できます。

于 2013-01-26T09:37:14.987 に答える
0

GROUP_CONCATSQLおよびexplodeForeachループで使用

$sql = 


"SELECT 
        GROUP_CONCAT(event SEPARATOR ","), GROUP_CONCAT(time SEPARATOR ","), 
        day , GROUP_CONCAT(hm SEPARATOR ",") FROM `entries` 
    WHERE 
        card=$card_t 
        AND YEAR(time)=$year 
        AND MONTH(time)=$month
        AND event IN (0,1,3) 
    GROUP BY 
        day
    ORDER BY 
        `time` ASC;";

foreachでは、

foreach ($entries as $entry) {
    if ($entry['event'] == "") {
        echo '<tr>';
             echo '<td>'.$no++.'</td>';
             echo '<td>No events</td>';
             ...................
        echo </tr>';
        continue;
    }

    $events = explode("," , $entry['event']);
    if (count($events) > 0) {
       // Have multiple row here
       foreach($events as $event) {
           ........................
       }
    } else {
        echo '<tr>';
             echo '<td>'.$no++.'</td>';
             echo '<td>'.$entry['event'].'</td>';
             ...................
        echo </tr>';
    }
}
于 2013-01-26T09:47:02.167 に答える