2016-03-27 9 views
1

Ich habe eine zwei Master-Tabelle. Da es sich bei der Beziehung um viele zu viele handelt, entscheide ich mich, eine Verknüpfungstabelle zu erstellen, um eine Beziehung zwischen eins und mehreren zu erstellen. Dies ist die Haupttabelle:Geben Sie einen Wert für eine Spalte aus Join-Master-Tabelle und Linktabelle auf Select-Abfrage

erste Tabelle

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) 

zweite Tabelle

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 Zeilen in set (0,00 sec)

LINK TABLE

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) 

Ich brauche die Tabelle in diesem Format wählen:

+------------+---------------------------------+-----------------------+ 
| 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 

Wie Sie sehen können, auf ID_REQUEST = 4 haben 6 bespielen tb_link_item_request. Also, Es muss einen Wert = 1 auf der Tabelle haben, die ich brauche. Was ich bei Query, Join, Group verwenden sollte, ist genau das, denke ich?

Jede Hilfe, die es so geschätzt.

UPDATE, als Kommentar unten scheint es unmöglich, so zu erstellen? Wie Kampf wie folgt aus:

+------------+---------------------------------+-----------------------+ 
| 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 

Ist es möglich?

+0

Soweit ich weiß, ist diese Art der Anzeige der Tabelle möglich durch die Programmierung Ihrer Anwendung nach Ihren Bedürfnissen. Becoz mysql gibt die Daten als ID_REQUEST, CATATAN, NAMA_TIPE zurück., auch doppelte Spaltennamen sind nicht erlaubt wie in Ihrem Fall haben Sie zwei Spalten mit dem Namen 'L' – geeksal

+0

Wie geben Sie id_item am | zurück L | P | M | C | N | LL | –

+0

Sie können 3 Tabellen natürlich verbinden und dann im gegebenen Format mit PHP anzeigen, aber dieses Format ist nicht möglich mit mysql (nach meinem Wissen) – geeksal

Antwort

0

Bitte geben gleichen Namen zu den Spalten in der LINK-Tabelle WRT beiden anderen Tabellen dh tb_link_item_request (ID, ID_REQUEST, ID_TIPE) dann natürlich wie JOIN verwenden:

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

Jetzt PHP nutzen Ihre Daten als

anzuzeigen
$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: gemäß aktualisiert Frage können Sie "<td>".$row['ID_TIPE']."</td>" statt '<td>1</td>' in dem obigen Code verwenden.

+0

Wenig verwirrt auf Ihrem Code, coz ich benutze codeigniter. Ich kämpfe weiter. Übrigens, vielen Dank. –

0

können Sie bedingte Aggregation verwenden, um ein Pivot Ergebnis zu erstellen:

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 

Ergebnis:

| 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

Verwenden von Daten aus tb_item_request Tabelle, die Abfrage in PHP zu konstruieren.

Sie können SUM(), BIT_OR(), GROUP_CONCAT() oder was auch immer Ihre Anforderung erfüllt.

+0

Sie Rock Mann, ich kannte nur den Operand '<=>' und BIT_OR. Danke –

+0

Ich erfuhr über '<=>' heute auf [SO] (http://stackoverflow.com/questions/36226019/mariadb-cannot-evaluate-select-1-where-null-null) :-) –

Verwandte Themen