Lamento se esta pergunta já foi feita, mas o que eu pesquisei até agora não respondeu à minha pergunta, então farei o possível para descrever meu problema e se for possível fazer isso em uma única declaração.
Eu tenho 3 mesas
Tabela de Ativos
+----------------+-------------+
| ID | Name |
+----------------+-------------+
| 1 | asset1 |
| 2 | asset2 |
| 3 | asset3 |
| 4 | asset4 |
+----------------+-------------+
Tabela de rótulos de campos personalizados
+----------------+-------------+
| ID | data |
+----------------+-------------+
| 1 | Label1 |
| 2 | Label2 |
| 3 | Label3 |
| 4 | Label4 |
+----------------+-------------+
Tabela de dados de campos personalizados
+----------------+-------------+-------------+-------------+
| ID | asset_id | input_id | data |
+----------------+-------------+-------------+-------------+
| 1 | 1 | 1 | This |
| 2 | 1 | 2 | That |
| 3 | 2 | 1 | Other |
| 4 | 4 | 4 | Thing |
+----------------+-------------+-------------+-------------+
Ok, eu sinto que estou realmente dando um fora da minha mente, mas deixe-me explicar.
Eu tenho um Assets Table
onde os clientes podem inserir seus diferentes ativos. Também tenho Custom Fields Label Table
onde criei a capacidade para o cliente criar campos de entrada personalizados que podem adicionar ao ativo caso os campos padrão que tenho não sejam suficientes. Por exemplo, tenho 2 campos em meus ativos chamados Nome e Número, mas digamos que o cliente precise de mais 4 campos chamados Rótulo1, Labe2, Rótulo3 e Rótulo4. Eles podem adicionar isso.
Depois que um cliente insere alguns dados em um de seus campos personalizados, esses dados são salvos no Custom Fields Data Table
para que possa haver vários registros para cada campo personalizado, dependendo de quantos campos personalizados eles salvaram dados para cada ativo.
Pelo resultado final abaixo, como você pode ver, gostaria que os títulos das colunas fossem do Custom Fields Label Table
e tudo isso fosse exibido em uma única linha.
Se for impossível que o nome da coluna venha de dados em um registro, posso conviver com isso, o mais importante é reunir todos os dados em um único registro.
Tenho quase certeza de que estou pedindo o impossível, mas preciso perguntar. Isso é mesmo possível? Eu estava mexendo com todos os tipos de junções, mas nada estava aderindo.
Resultado final
+----------------+-------------+-------------+-------------+-------------+-------------+
| ID | Name | Label1 | Label2 | Label3 | Label4 |
+----------------+-------------+-------------+-------------+-------------+-------------+
| 1 | asset1 | This | That | *null* | *null* |
| 2 | asset2 | Other | *null* | *null* | *null* |
| 3 | asset3 | *null* | *null* | *null* | *null* |
| 4 | asset4 | *null* | *null* | *null* | Thing |
+----------------+-------------+-------------+-------------+-------------+-------------+
O resultado final é melhor obtido no nível do aplicativo. No lado do servidor de banco de dados, apenas um número fixo de colunas pode ser recuperado, como este:
SELECT
a.*,
d1.data AS Label1,
d2.data AS Label2,
d3.data AS Label3,
d4.data AS Label4
FROM assets a
LEFT JOIN data d1 ON d1.asset_id = a.ID AND d1.input_id = 1
LEFT JOIN data d2 ON d2.asset_id = a.ID AND d2.input_id = 2
LEFT JOIN data d3 ON d3.asset_id = a.ID AND d3.input_id = 3
LEFT JOIN data d4 ON d4.asset_id = a.ID AND d4.input_id = 4
Você pode usar instruções preparadas para obter um número dinâmico de colunas com base na tabela de rótulos.
SELECT
GROUP_CONCAT(CONCAT('d', l.ID, '.data AS ', l.Name )) AS select_clause,
GROUP_CONCAT(CONCAT(
'LEFT JOIN data d', l.ID,
' ON d', l.ID, '.asset_id = a.ID AND d', l.ID, '.input_id = ', l.ID
) SEPARATOR ' ') AS join_clause
INTO @selectClause, @joinClause
FROM labels l;
SET @sql = CONCAT(
'SELECT a.*, ', @selectClause,
' FROM assets a ', @joinClause,
' ORDER BY a.ID'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras