Если в каждом документе может быть только один файл, вам следует объединить таблицу документов и файлов, чтобы в таблице документов было поле имени файла.
В этом примере предполагается взаимно-однозначное соотношение между файлами и документами. Вместо создания экзотических 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>
Вот, пожалуйста. Обратите внимание, что я не проверял это, могут быть ошибки синтаксического анализа и некоторые другие нелогичности, но я думаю, вы поняли из этого идею.