Эффективный запрос PHP / MySQL для создания HTML-таблицы в PHP - PullRequest
0 голосов
/ 15 декабря 2009

У меня есть 3 таблицы в моей базе данных MySql.

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

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

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

Не могли бы вы предложить запрос MySQL и функцию php, чтобы распечатать это в таблице, как показано ниже. Где d = documents-> files-> name, каждый год может иметь много документов для конкретной страны.

-----------------------------------------
|           | 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 Ответ

1 голос
/ 15 декабря 2009

Если в каждом документе может быть только один файл, вам следует объединить таблицу документов и файлов, чтобы в таблице документов было поле имени файла.

В этом примере предполагается взаимно-однозначное соотношение между файлами и документами. Вместо создания экзотических 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>

Вот, пожалуйста. Обратите внимание, что я не проверял это, могут быть ошибки синтаксического анализа и некоторые другие нелогичности, но я думаю, вы поняли из этого идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...