Mysql

左連接中的列衝突與許多列與 PHPMyAdmin 結果集

  • October 5, 2021

我有 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 中自己做。此範例是執行相同查詢管的結果,該查詢管在圖像中對其進行裁剪,以便他們欣賞列的重複。

在此處輸入圖像描述

除了為結果分析創建適當的解決方案外,我別無選擇。老實說,數據庫設計不好並不是不給它解決方案的藉口……最好的解決方案是使用後端的數據:


   // Conection to database
   function Open_Con_PDO($dbUsing){
       try {
           $conn = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_PRE . $dbUsing, DB_USERNAME, DB_PASS);
           $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
           $conn->exec("set names utf8");
           return $conn;
       } catch (PDOException $e) {
           die( $e->getMessage());
       }
   }
   
   // function to excute the query
   function BDquery2($dbquery, $dbUsing) {
      $dblink = $this->Open_Con_PDO($dbUsing);
      $resultset = $dblink->prepare($dbquery);
      $resultset->execute();
      $outPut=[];
      $rowc =0;
      while ($row = $resultset->fetch(PDO::FETCH_NUM)) {
           $outPut[$rowc]=[];
           foreach($row as $key => $value){
               $outPut[$rowc][$key]=[
                   'ColumnName'=>$resultset->getColumnMeta($key)['name'],
                   'value'=>$value
               ];
           }
           $rowc++;
      }
      return $outPut;
   }

   // USage Example:
   $dbquery = "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)";


   $result = BDquery2($dbquery,'database_name');

   var_dump($result);

輸出範例:

$result=[
   10=>[
       'ColumnName'='Prod_D_1',
       'value'=21
   ],
   ...
   24=>[
       'ColumnName'='Prod_D_1',
       'value'=1
   ],
];

pieda中沒有寫任何獲取數據的函式提供的結構可能無法解決其他復雜的場景,但它是那些發現這篇文章的人在面對列名的重複/衝突時有一個起點的基礎。

引用自:https://dba.stackexchange.com/questions/300600