Eu tenho 4 tabelas (75 colunas cada tabela aprox), mas elas compartilham colunas com o mesmo nome:
Tabela Mestre_Produto
Master_Product.PD_Prof_21
Tabela Produto_Estrutura
Product_Structure.PD_Prof_21
Estou fazendo junção esquerda; o que acontece é que ao trazê-los para o backend (php) eles são sobrescritos... espera-se 2 PD_Prof_21 mas no php apenas um é recuperado.
com base nessa solução (que não resolve meu cenário, pois tenho cerca de 300 colunas) https://stackoverflow.com/a/10530252/4717133
Não estou convencido da ideia de usar aliases com mais de 300 colunas... sei que os aliases nas colunas seriam algo como:
SELECT Columns as column1 ... // this would be very heavy to do for each column ...
Esta outra opção, não separa as tabelas no conjunto de resultados
SELECT
Master_Product.*,
Product_Structure.*,
Supplier_Product.*,
Product_Price.*,
ou pelo menos no php estou com problemas, acontece que das 300 colunas só recebo aquelas que não se repetem, se uma coluna for repetida, só me mostra a última com o último valor.
Primeira dúvida
Então eu queria saber se existe algum método no mysql que permita adicionar um prefixo automaticamente a todas as colunas em uma consulta do conjunto de resultados, um exemplo:
SELECT PREFIX ('Master_', Master_Product. *), PREFIX ('Structure_', Product_Structure. *) ...
e em PHP acesso a:
Master_PD_Prof_21
Structure_PD_Prof_21
Script PHP usado para recuperar as informações:
Conexões
function Open_Con_DB2($dbUsing) {
$dblink = mysqli_connect(DB_HOST, DB_USERNAME, DB_PASS, DB_PRE . $dbUsing);
if ($dblink) {
$dblink->query("SET NAMES 'utf8'"); # Enlace de Coneccion UTF-8
return $dblink;
} else {
#No conviene mostrar errores internos
#Cámbialos por mensajes personalizados en producción
die( 'Error de Conexión ('
.mysqli_connect_errno(). ') '
. mysqli_connect_error()
);
return null;
}
}
Obter informação.
function BDquery2($dbquery, $dbUsing) {
$dblink = $this->Open_Con_DB2($dbUsing);
if ($dblink) {
if ( $datos = mysqli_query($dblink, $dbquery) ) {
$outPut=array();
while ($row = mysqli_fetch_assoc($datos)) {
$outPut[]=$row;
}
} else {
$outPut['error']=$this->errorDB($dblink);
}
$this->Close_Con_DB($dblink);
} else {
$outPut['error']='No hay conexión';
}
return $outPut;
}
Consulta Executada: (desculpe mas o banco de dados está em espanhol XD)
SELECT
Master_Producto.*,
Producto_Estructura.*,
Producto_Proveedor.*,
Producto_Precio.*,
FROM Master_Producto
LEFT JOIN(SELECT * FROM Producto_Estructura) AS Producto_Estructura ON ( Master_Producto.Prod_Code = Producto_Estructura.Prod_Code AND Master_Producto.Prod_PF = Producto_Estructura.Prod_PF)
LEFT JOIN(SELECT * FROM Producto_Proveedor) AS Producto_Proveedor ON ( Master_Producto.Prod_Code = Producto_Proveedor.Prod_Code AND Master_Producto.Prod_PF = Producto_Proveedor.Prod_PF)
LEFT JOIN(SELECT * FROM Producto_Precio ORDER BY Prod_DateUpd DESC) AS Producto_Precio ON ( Master_Producto.Prod_Code = Producto_Precio.Prod_Code AND Master_Producto.Prod_PF = Producto_Precio.Prod_PF)
Segunda Dúvida
o estranho é que o PHPmyadmin se me mostra os resultados completos... exibe 1 seção para cada tabela... mas não consigo fazer isso sozinho no php. Este exemplo é o resultado da execução do mesmo tubo de consulta que o recorta em imagens para que apreciem a repetição de colunas.
Não vejo alternativa senão criar uma solução adequada para a análise do resultado. sinceramente que o banco de dados tenha um design ruim não é desculpa para não dar uma solução... e a melhor solução é trabalhar com os dados no backend:
exemplo de saída:
Não há nada escrito em pieda a função que obtém os dados oferece uma estrutura que pode não resolver outros cenários complexos mas é uma base para quem achar este post ter um ponto de partida caso enfrente a duplicação/colisão de nomes de colunas.