2010-04-14 83 views
6

我一直在努力爭取一段時間,我會盡可能簡單地在這裏解釋它。來自多個MySQL表格的單個HTML表格

考慮這個MySQL表:

+----------+-----------+---------+--------+ 
|status_id |session_id |pilot_id |present | 
+----------+-----------+---------+--------+ 
|1   |61   |901  |1  | 
|2   |63   |901  |1  | 
|3   |62   |901  |0  | 
|4   |62   |902  |1  | 
|5   |63   |903  |1  | 
+----------+-----------+---------+--------+ 

兩個session_idpilot_id外鍵使得參照另一個表的主鍵。同一pilot_id可以與不同的session_id相關聯,但每個pilot_id - session_id組合是唯一的。

我需要一個HTML表(PHP)會顯示這樣的數據:

+----------+---------+---------+---------+ 
|   |61  |62  |63  | 
+----------+---------+---------+---------+ 
|901  |X  |   |X  | 
|902  |   |X  |   | 
|903  |   |   |X  | 
+----------+---------+---------+---------+ 

因此,行是pilot_id和列session_id。當pilot_id - session_id組合的值爲1時,應檢查相應的單元格。 (即,當行組合爲零或組合不存在於MySQL表格中時,HTML表格中不應該出現任何內容)

Phew。

任何想法?

謝謝!


我試過erisco提出的答案,但我很困惑。 (評論字段太小,我的解釋,因此這個更新我的問題)。

這是我與工作實際數據:

+----------+-----------+---------+--------+ 
|status_id |session_id |pilot_id |present | 
+----------+-----------+---------+--------+ 
|7   |65   |33  |1  | 
|8   |66   |33  |1  | 
|9   |65   |17  |0  | 
|10  |66   |16  |1  | 
+----------+-----------+---------+--------+ 

我用$rows = mysqli_fetch_array($result);。我已經確認查詢正在返回正確的數據。

但是,當我使用ericso提出的答案時,我看起來似乎是任意的數據。下面是生成的HTML表格:

+----------+---------+---------+---------+---------+ 
|   |1  |3  |6  |7  | 
+----------+---------+---------+---------+---------+ 
|1   |X  |   |   |   | 
|3   |   |   |   |   | 
|6   |   |   |   |   | 
|7   |   |   |   |   | 
+----------+---------+---------+---------+---------+ 

此外,「X」的位置保持他毫無來由present值相同。

任何想法爲什麼會發生這種情況?

謝謝!

+0

如果您var_dump'd您的$行與我擁有的$行,您可能會看到不同之處。我會嘗試使用'$ rows = mysqli_fetch_all($ result,MYSQLI_ASSOC);' – erisco 2010-04-14 19:17:10

+0

啊,是的。我看到有什麼不對。當我使用mysqli_fetch_assoc我得到: 陣列(4){ [ 「STATUS_ID」] =>串(1) 「7」 [ 「pilot_id」] =>串(2) 「33」 [ 「SESSION_ID」] => string(2)「65」 [「present」] => string(1)「1」} 這只是第一行...爲什麼? (不管怎樣,我沒有Mysqlnd - 我無法在我的共享服務器上安裝)。這是錯誤: 致命錯誤:調用未定義函數mysqli_fetch_all()。謝謝! – 2010-04-14 20:23:50

+0

我剛剛結束這樣做: $ rows = array(); ($ rawRow = mysqli_fetch_assoc($ result)){ $ rows [] = $ rawRow; } – 2010-04-14 21:25:03

回答

3

幸運的是,你只需要一個查詢。假定$行是您從數據庫中提取的數據的格式:

<?php 

$rows = array(
    array(
    'status_id' => 1, 
    'session_id' => 61, 
    'pilot_id' => 901, 
    'present' => 1, 
), 
    array(
    'status_id' => 2, 
    'session_id' => 63, 
    'pilot_id' => 901, 
    'present' => 1, 
), 
    array(
    'status_id' => 3, 
    'session_id' => 62, 
    'pilot_id' => 901, 
    'present' => 0, 
), 
    array(
    'status_id' => 4, 
    'session_id' => 62, 
    'pilot_id' => 902, 
    'present' => 1, 
), 
    array(
    'status_id' => 5, 
    'session_id' => 63, 
    'pilot_id' => 903, 
    'present' => 1, 
) 
); 

$session_ids = array(); 
$pilot_ids = array(); 
$crosses = array(); 

foreach ($rows as $row) { 
    $session_ids[$row['session_id']] = $row['session_id']; 
    $pilot_ids[$row['pilot_id']] = $row['pilot_id']; 
    if ($row['present'] == 1) { 
    $cross_index = $row['session_id'].'.'.$row['pilot_id']; 
    $crosses[$cross_index] = $cross_index; 
    } 
} 

sort($session_ids); 
sort($pilot_ids); 

?> 

<table> 
    <tr> 
    <th></th> 
    <?php foreach ($session_ids as $sess_id): ?> 
    <th><?php echo $sess_id; ?></th> 
    <?php endforeach; ?> 
    </tr> 
    <?php foreach ($pilot_ids as $pilot_id): ?> 
    <tr> 
    <th><?php echo $pilot_id; ?></th> 
    <?php foreach ($session_ids as $sess_id): ?> 
    <?php if (isset($crosses[$sess_id.'.'.$pilot_id])): ?> 
    <td>X</td> 
    <?php else: ?> 
    <td></td> 
    <?php endif; ?> 
    <?php endforeach; ?> 
    </tr> 
    <?php endforeach; ?> 
</table> 
+0

+1 ...以及與邏輯很好地分離的表示。 – 2010-04-14 02:16:34

+0

謝謝你的幫助!不過,我很困惑。我已經在下面發佈了一個答案(對於我的解釋,評論字段太小),有什麼想法? – 2010-04-14 14:35:37

0

可以使用的算法是這樣的:

$sql = "SELECT DISTINCT session_id AS sid FROM pilot_session ORDER BY 1 ASC"; 
$rs = mysql_query($sql, $conn); 
$sessions = array(); 
while(false !== ($r = mysql_fetch_array($rs))){ 
    $sessions[] = $r['sid']; 
} 

$sql = "SELECT DISTINCT pilot_id AS pid FROM pilot_session ORDER BY 1 ASC"; 
$rs = mysql_query($sql, $conn); 
$pilots = array(); 
while(false !== ($r = mysql_fetch_array($rs))){ 
    $pilots[] = $r['pid']; 
} 

$pilot_presence = array(); 
$sql = "SELECT session_id, pilot_id, present FROM pilot_session"; 
$rs = mysql_query($sql, $conn); 
while(false !== ($r = mysql_fetch_array($rs))){ 
    $s_presence[$r['pilot_id']][$r['session_id']] = $r['present']; 
} 

echo "<table><tr><td>&nbsp</td>"; 
foreach($sessions as $s){ 
    echo "<td>$s</td>"; 
} 
echo "</tr>"; 
foreach($pilots as $p){ 
    echo "<tr><td>$p</td>"; 
    foreach($sessions as $s){ 
     $tp = ''; 
     if(isset($s_presence[$p][$s])){ 
      if($s_presence[$p][$s] == '1'){ 
       $tp = 'X'; 
      } 
     } 
     echo "<td>".$tp."</td>"; 
    }; 
    echo "</tr>"; 
} 
echo "</table>";