【问题标题】:Give a value to a column from joining master table and link table on select query在选择查询中为连接主表和链接表中的列赋值
【发布时间】:2016-03-27 09:08:00
【问题描述】:

我有两个主表。因为关系是多对多的,所以我决定创建链接表来创建一对多关系。 这是主表:

第一张桌子

MariaDB [ittresnamuda]> SELECT * FROM tb_item_request;
+---------+-----------+
| ID_TIPE | NAMA_TIPE |
+---------+-----------+
|       1 | Login     |
|       2 | Printer   |
|       3 | Monitor   |
|       4 | Computer  |
|       5 | Network   |
|       6 | Lain-lain |
+---------+-----------+
6 rows in set (0.00 sec)

第二张桌子

MariaDB [ittresnamuda]> select a.ID_REQUEST, a.CATATAN from tb_requestfix a;
+------------+---------------------------------+
| ID_REQUEST | CATATAN                         |
+------------+---------------------------------+
|          3 | Akan kami cek jaringan tersebut |
|          4 | Iya, go ahead. Appproved        |
|          5 | Sudah di refill                 |
|         28 | Saja                            |
+------------+---------------------------------+

4 行(0.00 秒)

链接表

MariaDB [ittresnamuda]> select * from tb_link_item_request;
+----+------------+---------+
| ID | id_request | id_item |
+----+------------+---------+
| 16 |          4 |       1 |
| 17 |          4 |       2 |
| 18 |          4 |       3 |
| 19 |          4 |       4 |
| 20 |          4 |       5 |
| 21 |          4 |       6 |
| 26 |          3 |       2 |
| 27 |          3 |       3 |
| 28 |          3 |       4 |
| 29 |          3 |       5 |
| 30 |          5 |       6 |
| 56 |         28 |       2 |
+----+------------+---------+
12 rows in set (0.00 sec)

我需要选择这种格式的表格:

+------------+---------------------------------+-----------------------+
| ID_REQUEST | CATATAN                         | L | P | M | C | N | LL|
+------------+---------------------------------+-----------------------+
|          3 | Akan kami cek jaringan tersebut |   | 1 | 1 | 1 | 1 | 1 |
|          4 | Iya, go ahead. Appproved        | 1 | 1 | 1 | 1 | 1 | 1 |
|          5 | Sudah di refill                 |   |   | 1 |   |   | 1 |
|         28 | Saja                            |   | 1 |   |   |   |   |
+------------+---------------------------------+-----------------------+

L = Login, P = Printer, M = Monitor, so on, so on

如您所见,ID_REQUEST = 4tb_link_item_request 上有 6 条记录。所以,我需要的表上必须有一个值 = 1。我猜想我应该在查询、加入、组中使用什么?

感谢任何帮助。

UPDATE,就像下面的评论一样,似乎不可能这样创建? 这样怎么样:

+------------+---------------------------------+-----------------------+
| ID_REQUEST | CATATAN                         | L | P | M | C | N | LL|
+------------+---------------------------------+-----------------------+
|          3 | Akan kami cek jaringan tersebut |   | 2 | 3 | 4 | 5 | 6 |
|          4 | Iya, go ahead. Appproved        | 1 | 2 | 3 | 4 | 5 | 6 |
|          5 | Sudah di refill                 |   |   | 3 |   |   | 6 |
|         28 | Saja                            |   | 2 |   |   |   |   |
+------------+---------------------------------+-----------------------+

L = Login, P = Printer, M = Monitor, so on, so on

有可能吗?

【问题讨论】:

  • 据我所知,通过根据您的显示需求对您的应用程序进行编程,可以实现这种类型的表格显示。 Becoz mysql 会将数据返回为 ID_REQUEST、CATATAN、NAMA_TIPE。也不允许重复的列名,就像在您的情况下,您有两个名为“L”的列
  • 如何返回 id_item on |大号 |磷 |中号 | C | N | LL |
  • 您可以自然加入 3 个表,然后使用 php 以给定格式显示,但使用 mysql 无法使用这种格式(据我所知)
  • 您是否希望我发布使用 php 在 html 表中显示数据的解决方案。
  • 是的,请。谢谢。

标签: mysql pivot


【解决方案1】:

请给 LINK 表中的列与其他两个表相同的名称,即 tb_link_item_request (ID,ID_REQUEST,ID_TIPE) 然后使用自然连接作为:

SELECT ID_REQUEST,CATATAN, ID_TIPE 
FROM tb_item_request 
     natural join tb_link_item_request 
     natural join tb_requestfix;

现在使用 PHP 将您的数据显示为

$query="SELECT ID_REQUEST,CATATAN, ID_TIPE 
        FROM tb_item_request 
        natural join tb_link_item_request 
        natural join tb_requestfix order by ID_REQUEST,ID_TIPE";
$result=mysqli_query($link,$query);
if (!$result)
{
  echo("Error description: " . mysqli_error($link));
}
if(mysqli_num_rows($result)>0){
 echo '<table>'
  .'<tr>'
   .'<th>ID_REQUEST</th>'
   .'<th>CATATAN</th>'
   .'<th>L</th>'
   .'<th>P</th>'
   .'<th>M</th>'
   .'<th>C</th>'
   .'<th>N</th>'
   .'<th>LL</th>'
  .'</tr>';

  $prevIDReq=null;
  $rowCount=0;    
  while($row=mysqli_fetch_array($result)){

    if($prevIDReq!=$row['ID_REQUEST']){
      if($prevIDReq!=null)
      {
         while($rowCount<=6){
           echo '<td></td>';
           $rowCount++
         }
         echo '</tr>';
         $rowCount=0;
      }

      echo "<tr>"
           ."<td>".$row['ID_REQUEST']."</td>"
           ."<td>".$row['CATANTAN']."</td>";

    }

    if($row['ID_TIPE']==1){
      echo '<td>1</td>';
    }

    if($row['ID_TIPE']==2){
      while($rowCount<1){
         echo '<td></td>';
         $rowCount++;  
      }
      echo '<td>1</td>';
    }

    if($row['ID_TIPE']==3){
      while($rowCount<2){
         echo '<td></td>';
         $rowCount++;  
      }
      echo '<td>1</td>';
    }        

    if($row['ID_TIPE']==4){
      while($rowCount<3){
         echo '<td></td>';
         $rowCount++;  
      }
      echo '<td>1</td>';
    }

    if($row['ID_TIPE']==5){
      while($rowCount<4){
         echo '<td></td>';
         $rowCount++;  
      }
      echo '<td>1</td>';
    }

    if($row['ID_TIPE']==6){
      while($rowCount<5){
         echo '<td></td>';
         $rowCount++;  
      }
      echo '<td>1</td>';
    }

    $rowCount++:
  }


  while($rowCount<=6){
           echo '<td></td>';
           $rowCount++
         }

  echo '</tr>'
       .'</table>';
}

更新:根据更新后的问题,您可以在上述代码中使用 "&lt;td&gt;".$row['ID_TIPE']."&lt;/td&gt;" 而不是 '&lt;td&gt;1&lt;/td&gt;'

【讨论】:

  • 对您的代码有点困惑,因为我正在使用 codeigniter。我一直在挣扎。顺便说一句,非常感谢。
【解决方案2】:

您可以使用条件聚合来创建透视结果:

SELECT rf.ID_REQUEST, rf.CATATAN
    , BIT_OR(lir.id_item <=> 1) OR NULL AS Login
    , BIT_OR(lir.id_item <=> 2) OR NULL AS Printer
    -- and so on
FROM tb_requestfix rf
LEFT JOIN tb_link_item_request lir ON lir.id_request = rf.ID_REQUEST
GROUP BY rf.ID_REQUEST, rf.CATATAN

结果:

| ID_REQUEST |                         CATATAN |  Login | Printer |
|------------|---------------------------------|--------|---------|
|          3 | Akan kami cek jaringan tersebut | (null) |       1 |
|          4 | Iya, go ahead. Appproved        |      1 |       1 |
|          5 | Sudah di refill                 | (null) |  (null) |
|         28 | Saja                            | (null) |       1 |

sqlfiddle

使用来自tb_item_request 表的数据,在 PHP 中构造该查询。

您可以使用SUM()BIT_OR()GROUP_CONCAT() 或任何最符合您要求的方法。

【讨论】:

  • 你这个摇滚人,我只知道操作数 '' 和 BIT_OR。谢谢
  • 我今天在SO 上了解到&lt;=&gt; :-)
猜你喜欢
  • 2015-12-25
  • 2021-06-15
  • 2017-08-29
  • 2011-06-16
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多