2016-03-24 12 views
2

Ich habe dieses Problem, wenn ich Ergebnisse aus der Datenbank gruppieren möchte. Ich habe zu Tabellen 1) Geräte und 2) device_groups. Ich habe INNER JOIN verwendet, um verwandte Daten zu erhalten.PHP und MYSQL Gruppe Ergebnisse aus der Datenbank und Anzeige

$mysqli = new mysqli('localhost', 'name', 'pass', 'tbl'); 


$qry = " 
     SELECT g.id as groupId, g.name as groupName, d.device_id 
     FROM librenms.devices as d 
     INNER JOIN librenms.device_groups as g 
       ON d.hostname LIKE CONCAT('%', mysql.SPLIT_STR(g.pattern, '\"', 2), '%') 
     WHERE g.pattern LIKE '_devices.hostname%' 
     ORDER BY g.id 
"; 


$qid = $mysqli->query($qry); 

Der folgende Code sieht wie folgt aus:

<table> 
<tr> 
    <th>Group Name</th> 
    <th>Device ID</th> 
</tr> 
<?php while($row = $qid->fetch_assoc()){ 
    $deviceId = split(",",$row["device_id"]); 
?> 
    <tr> 
     <td><?php echo $row["groupName"] ?> </td> 
     <td><?php echo $deviceId[0]; array_shift($deviceId) ?></td> 
    </tr> 
    <?php foreach($deviceId as $device){ ?> 
     <tr> 
      <td></td> 
      <td><?php echo $device ?></td> 
     </tr> 
    <?php } ?> 
<?php } ?> 
</table> 

Und ich bekomme das Ergebnis wie folgt aus:

Group Name | Device ID 
group1  | 154 
group1  | 155 
group1  | 156 
group2  | 157 
group2  | 158 
group2  | 159 
group3  | 160 
group3  | 161 

Also, meine Frage ist, was zu einer Gruppe Datum der gute Weg ist durch groupName oder groupId und es wie in der folgenden Tabelle anzeigen? Wie Sie sehen können, möchte ich den Gruppennamen nur einmal ausgeben lassen und alle Geräte, die zu dieser Gruppe gehören, werden in Verbindung mit dem Gruppennamen gedruckt.

Group Name  | Device ID 
........................... 
    group1  | 154 
       | 155 
       | 156 
........................... 
    group2  | 157 
       | 158 
       | 159 
........................... 
    group3  | 160 
       | 161 

Antwort

0

Das erwartete Ergebnis kann in einem user variable durch Aufzeichnen der vorherigen Gruppennamen erreicht werden.

ändern $qry wie folgt:

SELECT 
    g.id as groupId, 
    IF(g.name = @last_name, '', g.name) as groupName, 
    d.device_id, 
    @last_name := g.name 
FROM librenms.devices as d 
INNER JOIN librenms.device_groups as g 
     ON d.hostname LIKE CONCAT('%', mysql.SPLIT_STR(g.pattern, '\"', 2), '%') 
CROSS JOIN (SELECT @last_name := '') param 
WHERE g.pattern LIKE '_devices.hostname%' 
ORDER BY g.id 
Verwandte Themen