簡體   English   中英

在一列中放置多個MySQL行

[英]Putting more than one MySQL Row in a column

我遇到的問題是,我的數據庫中有一個表,並且希望在一列中獲取該表的某些行。

例如,我將此表命名為klz:

|-------+-----------+-----+-----|
| ID    | Name      | LNr | LID |
|-------+-----------+-----+-----|
| 1     | 0000_01   | 1   | 16  |
| 2     | 0000_01   | 2   | 35  |
| 3     | 0000_02   | 1   | 16  |
| 4     | 0000_02   | 2   | 35  |
| 5     | 0000_10   | 1   | 18  |
| ..    | ..        | ..  | ..  |
| 297   | 0214_01   | 1   | 23  |
| 298   | 0214_01   | 1   | 66  |
| 299   | 0214_01   | 2   | 24  |
| 300   | 0214_01   | 2   | 67  |
| 301   | 0214_01   | 3   | 26  |
| 302   | 0214_01   | 4   | 28  |
| 303   | 0214_01   | 4   | 69  |
| 304   | 0214_01   | 5   | 30  |
| 305   | 0214_01   | 5   | 70  |
| 306   | 0214_01   | 6   | 31  |
| 307   | 0214_01   | 6   | 71  |
|-------+-----------+-----+-----|

如果我在PHP中使用while循環獲取此表,則將獲得相同的表。

所以我想要的是這樣的一張桌子:

|-----------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
| Name      | LNr1    | LNr2    | LNr3    | LNr4    | LNr5    | LNr6    | LNr7    | LNr8    | LNr9    | LNr10   |
|-----------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
| 0000_01   | 16      | 35      |         |         |         |         |         |         |         |         |
| 0000_02   | 16      | 35      |         |         |         |         |         |         |         |         |
| 0000_10   | 18      |         |         |         |         |         |         |         |         |         |
| 0214_01   | 23 - 66 | 24      | 26 - 68 | 28 - 69 | 30 - 70 | 31 - 71 |         |         |         |         |
|-----------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|

該表具有“名稱”列和可能的LNr從1到10的枚舉列。 LNr列中的數據是上表中的LID。

我的問題是,如何在右側列中加上名稱和LNr和LID的依存關系? 在此表中,您列出了所有名稱一次,並為所有LNr設置了正確的LID。

這是我正在嘗試使用的代碼...直到現在,它僅適用於第一個LNr列,將LID寫入以下內容:

<?php
  include "dbconnect.php";

  $klz = mysqli_query($db, "SELECT      *
                            FROM        klz;");  

?>  
  <div class="container-fluid">
  <div class="row">
    <div class="table-responsive">
    <div class="col-xs-12">
    <table id="grid-klz" class="table table-condensed table-hover table-striped">
      <thead>   
        <tr>
          <th> Name </th>
          <th> Leitungsnr 1</th>
          <th> Leitungsnr 2</th>
          <th> Leitungsnr 3</th>
          <th> Leitungsnr 4</th>
          <th> Leitungsnr 5</th>
          <th> Leitungsnr 6</th>
          <th> Leitungsnr 7</th>
          <th> Leitungsnr 8</th>
          <th> Leitungsnr 9</th>
          <th> Leitungsnr 10</th>
        </tr>  
      </thead>

    <tbody>
<?php         
  $name_old = ""; 
  $lnr_old  = "";
  $name     = []; 
  $lnr      = [];
  $lid      = [];

  while($row = mysqli_fetch_array($klz, MYSQL_ASSOC)){
    $name[] = $row['Name'];
    $lnr[] = $row['LNr'];
    $lid[] = $row['LID'];
  }     

  for($i=0; $i <= sizeof($name)-1; $i++){

    if($name[$i] != $name_old){

      echo "<tr>";
        echo "<td>". $name[$i] . "</td> \n";

        if($lnr[$i] != $lnr_old){
          echo "<td>". $lid[$i] . "</td> \n";

          $lnr_old != $lnr[$i];
        }

      echo "</tr>";

      $name_old = $name[$i];
    }
  }    
?>
    </tbody>
  </table>

    </div>
    </div>
  </div>  
  </div>

<?php  
  mysqli_close($db);
?>

希望您知道我的意思並嘗試做。 如果不是隨意請問。 謝謝

從此查詢開始

SELECT
    Name AS tableRows,
    LNr AS tableCols,
    GROUP_CONCAT(LID ORDER BY LID SEPARATOR ' - ') AS cellValue
FROM klz
GROUP BY 1,2
ORDER BY 1,2;

現在將結果放入數組中。 此外,獲取其他數組中的每個不同的列(LNr)和行(Name)。

$ar = array();
$tableRows = array();
$tableCols = array();

while($row = mysqli_fetch_array($klz, MYSQL_ASSOC)){
    $ar[$row['tableRows']][$row['tableCols']] = $row['cellValue'];
    $tableRows[] = $row['tableRows'];
    $tableCols[] = $row['tableCols'];
}

$tableRows = array_unique($tableRows);
$tableCols = array_unique($tableCols);

用行和列對2個數組排序

sort($tableRows);
sort($tableCols);

foreach行,foreach列,多數組的回顯值

echo "<table>";
echo "<tr><th>Name</th>";

foreach($tableCols as $x){
    echo "<th>LNr$x</th>";
}

echo "</tr>";

foreach($tableRows as $y){
    echo "<tr><td>$y</td>";
    foreach($tableCols as $x){
        echo "<td>" . $ar[$y][$x] . "</td>";
    }
    echo "</tr>";
}
echo "</table>";

我不確定我是否理解正確,但是我認為此查詢應該與您要執行的操作非常接近:

select name, 
max(LNr1) as LNr1,
max(LNr2) as LNr2,
...
max(LNr10) as LNr10
from
(
    select name, 
    if(LNr = 1, LID, null) as LNr1,
    if(LNr = 2, LID, null) as LNr2,
    ...
    if(LNr = 10, LID, null) as LNr10
    from klz
) res
group by name

內部將您的行拆分為不同的“ LNr”列,並為您提供我喜歡的“階梯”結果集。 現在我們要做的就是將其展平,這就是外部查詢通過為每一行選擇max(LNr)並按名稱分組來進行的操作。 之所以起作用,是因為默認情況下實際值始終大於null,因此為每列選擇最大值將擺脫null值,並為您提供實際值。

你可以這樣寫查詢

SELECT a.name,
GROUP_CONCAT(LNr1.LID SEPARATOR '-') AS LNr1,
GROUP_CONCAT(LNr2.LID SEPARATOR '-') AS LNr2,
GROUP_CONCAT(LNr3.LID SEPARATOR '-') AS LNr3,
GROUP_CONCAT(LNr4.LID SEPARATOR '-') AS LNr4,
GROUP_CONCAT(LNr5.LID SEPARATOR '-') AS LNr5,
GROUP_CONCAT(LNr6.LID SEPARATOR '-') AS LNr6,
GROUP_CONCAT(LNr7.LID SEPARATOR '-') AS LNr7,
GROUP_CONCAT(LNr8.LID SEPARATOR '-') AS LNr8,
GROUP_CONCAT(LNr9.LID SEPARATOR '-') AS LNr9,
GROUP_CONCAT(LNr10.LID SEPARATOR '-') AS LNr10
FROM klz AS a
LEFT JOIN klz AS LNr1 ON LNr1.LNr = 1 AND a.id = LNr1.id
LEFT JOIN klz AS LNr2 ON LNr2.LNr = 2 AND a.id = LNr2.id
LEFT JOIN klz AS LNr3 ON LNr3.LNr = 3 AND a.id = LNr3.id
LEFT JOIN klz AS LNr4 ON LNr4.LNr = 4 AND a.id = LNr4.id
LEFT JOIN klz AS LNr5 ON LNr5.LNr = 5 AND a.id = LNr5.id
LEFT JOIN klz AS LNr6 ON LNr6.LNr = 6 AND a.id = LNr6.id
LEFT JOIN klz AS LNr7 ON LNr7.LNr = 7 AND a.id = LNr7.id
LEFT JOIN klz AS LNr8 ON LNr8.LNr = 8 AND a.id = LNr8.id
LEFT JOIN klz AS LNr9 ON LNr9.LNr = 9 AND a.id = LNr9.id
LEFT JOIN klz AS LNr10 ON LNr10.LNr = 10 AND a.id = LNr10.id
GROUP BY a.name;

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM