Для этого требуется два запроса. Сначала выберите File
:
SELECT * FROM File WHERE (...)
Затем получите Attributes
:
SELECT *
FROM AttValues
JOIN Attributes ON (Attributes.AttId = AttValues.AttId)
WHERE FileId = $id
Последний запрос предоставит вам одну строку на Attribute
, которую вы можете программно развернуть для отображения на вашем веб-интерфейсе:
foreach(row in result) {
table.AddColumn(Header = row['AttName'], Value = row['AttValue']);
}
При необходимости адаптируйтесь к локальной среде программирования.
Конечно, это работает только для одиночных File
или File
с одинаковыми атрибутами. Если вы хотите отобразить несколько файлов с разными Attributes
, вместо этого вы можете предварительно выбрать все AttName
s:
SELECT Attributes.AttId, Attributes.AttName
FROM Attributes
JOIN AttValues ON (Attributes.AttId = AttValues.AttId)
WHERE FileId IN ( $list_of_ids )
Затем загрузите значения следующим образом:
SELECT *
FROM AttValues
WHERE FileId IN ( $list_of_ids )
и использовать локальный ассоциативный массив для сопоставления AttId
s с индексами столбцов.
В качестве окончательной оптимизации вы можете объединить два последних запроса в OUTER JOIN
, чтобы избежать третьего обхода. Хотя это, вероятно, увеличит объем передаваемых данных, это также упростит заполнение таблицы, если ваша библиотека классов поддерживает именованные столбцы.