2009-12-15 51 views
0

我的MySql數據庫中有3個表格。高效的php/mysql查詢在php中生成html表格

------------- 
| countries | 
------------- 
| iso  | 
| name  | 
------------- 

-------------------- 
| documents  | 
-------------------- 
| id    | 
| country_iso  | 
| publication_date | 
-------------------- 

--------------- 
| files  | 
--------------- 
| document_id | 
| name  | 
--------------- 

您能否建議一個mysql查詢和php函數將它打印到表中,如下所示。 其中d =文件 - >文件 - >名稱,每年可以有一個特定國家的許多文件。

----------------------------------------- 
|   | 2009 | 2008 | 2007 | 2006 | 
----------------------------------------- 
| country a | d d |  | d | d | 
| country b |  | d | d |  | 
| country c | d | d d |  | d | 
| country d | d |  | d d |  | 
----------------------------------------- 

在此先感謝

回答

1

如果可以有每個每個文件只有一個文件,你要結合文檔和文件表,以便文件表中有一個文件名場。

本示例假設文件和文檔之間存在一對一的關係。不用創建奇特的SQL查詢,只需從數據庫中選擇純數據並使用PHP進行轉換就簡單多了。

SELECT 
    countries.name country, 
    documents.name document, 
    files.name filename, 
    DATE_FORMAT(publication_date, '%Y') 
FROM 
    documents 
LEFT JOIN 
    countries 
ON 
    documents.country_iso = countries.iso 
LEFT JOIN 
    files 
ON 
    documents.id = files.document_id 

這將導致從數據庫中跟隨着表:

country | document  | filename  | year 
---------------------------------------------------- 
Germany | doc_1  | doc_1.pdf | 2009 
Germany | doc_2  | doc_2.pdf | 2007 
Germany | doc_3  | doc_3.pdf | 2007 
Norway  | doc_6  | doc_6.pdf | 2008 
... 

下一頁該表必須用PHP來適當的形式進行改造。在這種情況下,適當的形式將所有的文檔都在逐年這反過來也得到客戶的索引收錄:

$q = mysql_query("SELECT ..."); 
$result = array(); 
$years = array(); 

while($row = mysql_fetch_assoc($q)) { 
    $result[$row['country']][$row['year']][] = array('document' => $row['document'], 'filename' => $row['filename']); 
    $years[] = $row['year']; 
} 

// Max and min years are used to print the table header 
$max_year = max($years); 
$min_year = min($years); 

現在,如果你想找到德國的2009年度的文件,你可以只使用$result['Germany'][2009];。但你可以使用漂亮的循環來自動打印表格:

<table> 
    <tr> 
     <th>Country</th> 
     <?php for($y = $max_year; $y >= $min_year; $y--): ?> 
     <th><?php echo $y; ?></th> 
     <?php endfor; ?> 
    </tr> 
    <?php foreach($result as $country => $years): ?> 
    <tr> 
     <td><?php echo $country; ?></td> 
     <?php for($y = $max_year; $y >= $min_year; $y--): ?> 
     <td> 
      <?php if(isset($years[$y])): foreach($years[$y] as $document): ?> 
       <a href="<?php echo $document['filename']; ?>"> 
        <?php echo $document['name']; ?> 
       </a>     
      <?php endforeach; endif; ?> 
     </td> 
     <?php endfor; ?> 
    </tr> 
    <?php endforeach; ?> 
</table> 

你走了。請注意,我沒有測試過這個,可能會出現解析錯誤和其他一些不合邏輯的情況,但我想你會從中得到這個想法。

+0

非常感謝,工作完美。 – Think 2009-12-15 14:35:43