Вы используете антипаттерн EAV. Невозможно автоматически создать описываемую вами сводную таблицу без жесткого кодирования характеристик, которые вы хотите включить. Как упоминает @OMG Ponies, вам нужно использовать динамический SQL для генерации запроса в произвольном порядке для набора характеристик, которые вы хотите включить в результат.
Вместо этого я рекомендую вам выбирать характеристики по одной на строку, так как они хранятся в базе данных, и если вы хотите, чтобы объект приложения представлял единое проверяемое оборудование со всеми его характеристиками, вы пишете код для циклического перемещения по строкам по мере того, как извлекайте их из приложения, собирая их в объекты.
Например, в PHP:
$sql = "SELECT uut_sn, characteristic_name, characteristic_value
FROM unit_characteristics";
$stmt = $pdo->query($sql);
$objects = array();
while ($row = $stmt->fetch()) {
if (!isset($objects[ $row["uut_sn"] ])) {
$object[ $row["uut_sn"] ] = new Uut();
}
$objects[ $row["uut_sn"] ]->$row["characteristic_name"]
= $row["characterstic_value"];
}
Это имеет несколько преимуществ по сравнению с жестким кодированием имен характеристик в вашем запросе:
- Это решение использует только один SQL-запрос вместо двух.
- Для построения динамического SQL-запроса не требуется сложного кода.
- Если вы забудете одну из характеристик, это решение все равно будет автоматически найдено.
- GROUP BY в MySQL часто работает медленно, и это позволяет избежать использования GROUP BY.