Tabela de junção à esquerda com vários registros em um registro mysql

Cesar Bielich

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 Tableonde os clientes podem inserir seus diferentes ativos. Também tenho Custom Fields Label Tableonde 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 Tablepara 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 Tablee 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       |
+----------------+-------------+-------------+-------------+-------------+-------------+
user14717238

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

rabeca

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;

rabeca

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Inserindo vários registros em uma tabela usando um registro de canto, incrementando o Pk

junção à esquerda em pandas com vários registros com a mesma chave

Mysql - Como criar um alias de dados de uma tabela inteira em uma junção à esquerda

Como remodelar uma tabela com vários registros para o mesmo id em uma tabela com um registro por id sem perder informações?

Um registro de vários registros na tabela

Inserindo vários registros em mySQL com NodeJS evitando injeção e obtendo o ID de cada registro

MongoDB - converter um registro com uma matriz em vários registros em uma nova coleção

Obtenha todos os registros com a junção à esquerda, mesmo que não haja nenhum registro na tabela B

Consulta SQL para procurar um registro em uma tabela e substituí-lo por vários registros de outra tabela

Converta vários registros MySQL em um único registro

dividir um registro em vários registros com base na categoria de programa assistido

Como obter saída de vários registros com base em um único registro

MYSQL: selecione apenas o registro mais recente (na tabela de junção à esquerda)

MySQL - junção à esquerda no último registro na tabela à direita

Selecionando vários campos usando a condição If, com junção à esquerda no mysql - erro de lançamento

Como posso selecionar registros que correspondam a vários valores em uma tabela de vinculação usando uma instrução de junção do MySQL?

Rails cria vários registros na tabela de junção

MSSQL - Necessidade de consultar vários registros em um único registro / conjunto de resultados - com base em Id e Data

Como juntar com várias instâncias de um modelo ao usar uma tabela de junção com registro ativo?

Como juntar com várias instâncias de um modelo ao usar uma tabela de junção com registro ativo?

Junção à esquerda de três tabelas com junção interna em dois no mysql

Soma MYSQL com base na condição if de outra tabela na junção à esquerda

Como posso realizar essa junção em uma tabela com vários registros por chave sem retornar vários registros por chave?

Expressão de consulta F #: Como fazer uma junção à esquerda e retornar os registros em que a tabela associada é nula?

registros da tabela à esquerda incomparáveis em uma junção à esquerda nos pandas

MySql - junção à esquerda com onde na tabela relacionada

MySql - junção à esquerda com onde na tabela relacionada

Tentando encontrar registros únicos em uma tabela que não tem um registro de negação

Como eliminar todos os registros agrupados com base em critérios de falha em um registro