2016-03-27 8 views
1

私は2つのマスターテーブルを持っています。関係は多岐にわたるので、リンクテーブルを作成して1対多の関係を作成することにしました。 これはマスターテーブルである:セット内選択クエリでの結合マスタテーブルとリンクテーブルからのカラムへの値の指定

まずテーブル

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 = 4にはtb_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 

可能ですか?

+0

私の知る限りでは、ディスプレイのニーズに合わせてアプリケーションをプログラミングすることで、このタイプの表の表示を可能にしています。 Becoz mysqlはデータをID_REQUEST、CATATAN、NAMA_TIPEとして返します。また、重複した列名はあなたの場合のように 'L'という名前の2つの列を持つことはできません – geeksal

+0

どのように返すid_item on | L | P | M | C | N | LL | –

+0

自然な3つのテーブルを結合し、phpを使用して指定されたフォーマットで表示することができますが、このフォーマットはmysql(私の知る限り)を使用することはできません – geeksal

答えて

0

(ID、ID_REQUEST、ID_TIPE)は、その後、自然とJOINを使用すなわちtb_link_item_requestリンクテーブルWRT他の二つのテーブルの列に同じ名前を教えてください:

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>'; 
} 

UPDATE:あなたは上記のコードで"<td>".$row['ID_TIPE']."</td>"代わりの'<td>1</td>'を使用することができます更新質問のとおり。

+0

少しあなたのコードに混乱して、私はcodeigniterを使用しています。私は苦闘し続けます。 Btw、ありがとう。 –

0

あなたはピボット結果を作成するために、条件付きの集約を使用することができます。

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 

結果:tb_item_requestテーブルから

| 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

使用データを、PHPでそのクエリを構築します。

SUM()BIT_OR()GROUP_CONCAT()など、ご自分の要件に最も適したものを使用することができます。

+0

ロックマン、私はちょうどオペランド '<=>'とBIT_ORを知っていた。ありがとう –

+0

今日私は[<=>]について学びました:[SO](http://stackoverflow.com/questions/36226019/mariadb-cannot-evaluate-select-1-where-null-null):-) –

関連する問題