1

我的数据库中有表条目的结构:

id | card | event | time | day | hm
  • > id - 是每个条目的唯一 ID。
  • >- 是数字。
  • >事件- 是数字(0、1、2 或 3)
  • >时间- 是 mysql_timestamp
  • > day - 是添加条目时的月份日期(日期(“​​j”,时间())
  • >- 一些其他信息...

我想在 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 月为 31 行)。如果第 (1-31) 天没有条目,则行必须是:如果天行只有两个条目,则必须是:

<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

如果我理解正确,您想对输出进行分组。建立组的标准是日期。一种方法是在循环之前定义一个变量,在其中存储最后处理条目的日期。在输出条目之前,您检查条目的日期是否与此变量中的日期相同......然后您仍然在一个组中并且应该以不同的方式输出它。

由于您的输出格式非常特殊,在您的情况下实现这一点可能有点困难。首先循环查询结果并将条目存储在多维数组中可能更容易,其中日期是第一级的键,在下一级存储与该日期相关的所有条目。所以你得到:

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

然后你可以在这个数组上做另一个循环,并if (count($array[$currentKey]) == 1)用来检查这个日期是否只有一个事件或更多。

于 2013-01-26T09:37:14.987 回答
0

GROUP_CONCAT在 sql 和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 回答