我有 4 个表(每个表大约 75 列),但它们共享具有相同名称的列:
表大师_产品
Master_Product.PD_Prof_21
表产品_结构
Product_Structure.PD_Prof_21
我正在做左连接;发生的情况是,当它将它们带到后端(php)时,它们会被覆盖……预期为 2 PD_Prof_21,但在 php 中只有一个是 retrive。
基于这个解决方案(它不能解决我的场景,因为我有大约 300 列)https://stackoverflow.com/a/10530252/4717133
我不相信使用超过 300 列的别名的想法......我知道列中的别名类似于:
SELECT Columns as column1 ... // this would be very heavy to do for each column ...
此其他选项不会分隔结果集中的表
SELECT
Master_Product.*,
Product_Structure.*,
Supplier_Product.*,
Product_Price.*,
或者至少在 php 中我有问题,事实证明在 300 列中我只收到那些不重复的列,如果重复列,它只会显示最后一个具有最后一个值的列。
第一个疑问
所以我想知道mysql中是否有任何方法允许自动为结果集查询中的所有列添加前缀,例如:
SELECT PREFIX ('Master_', Master_Product. *), PREFIX ('Structure_', Product_Structure. *) ...
并在 PHP 中访问:
Master_PD_Prof_21
Structure_PD_Prof_21
用于检索信息的 PHP 脚本:
连接
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;
}
}
获取信息。
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;
}
查询已执行:( 对不起,数据库是西班牙语 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)
第二个疑问
奇怪的是,PHPmyadmin 如果它向我显示完整的结果......它为每个表显示 1 个部分......但我不能在 php.ini 中自己做。此示例是执行相同查询管的结果,该查询管在图像中对其进行裁剪,以便他们欣赏列的重复。
除了为结果分析创建适当的解决方案外,我别无选择。老实说,数据库设计不好并不是不给它解决方案的借口……最好的解决方案是使用后端的数据:
输出示例:
pieda没有写任何获取数据的函数提供的结构可能无法解决其他复杂的场景,但它是那些发现这篇文章的人在面对列名的重复/冲突时有一个起点的基础。