2016-08-29 3 views
3

Ich habe eine Tabelle eingerichtet, wo Auszeichnungen von einer Benutzer-ID verfolgt werden. Es gibt mehrere Datensätze mit derselben Benutzer-ID, aber unterschiedlichen Auszeichnungen.Anzeigen mehrerer Datensätze in einer Zeile mit doppelter Benutzer-ID

Aktuelle Datenbank

+---------+----------+---------------------+ 
| user_id | award_id | award_date   | 
+---------+----------+---------------------+ 
|  1 |  26 | 2016-08-20 00:00:00 | 
|  1 |  27 | NULL    | 
|  1 |  28 | NULL    | 
|  1 |  29 | NULL    | 
|  1 |  30 | NULL    | 
|  1 |  31 | NULL    | 
|  2 |  26 | 2016-08-19 00:00:00 | 
|  2 |  2 | NULL    | 
|  3 |  36 | NULL    | 
|  3 |  2 | NULL    | 
|  4 |  1 | NULL    | 
|  4 |  2 | NULL    | 
|  5 |  1 | NULL    | 
|  5 |  2 | NULL    | 
|  6 |  6 | 2016-08-23 23:06:48 | 
|  6 |  1 | NULL    | 
|  2 |  20 | NULL    | 
|  3 |  20 | 2016-08-18 00:00:00 | 
|  4 |  20 | NULL    | 
|  5 |  20 | NULL    | 
+---------+----------+---------------------+ 

Der aktuelle Code verwende ich nicht in der Lage, die Datensätze dem Benutzer angezeigt werden soll. Es wird nur ein einziges Ergebnis erhalten. Ich habe versucht, die GROUP BY zu entfernen, aber es muss alle Datensätze in einer Zeile mit den mehreren Ergebnissen beibehalten.

$sql = "SELECT * FROM awards ORDER BY id ASC"; 
$results = mysqli_query($con, $sql); 
$awards = array(); 
while ($row = mysqli_fetch_assoc($results)) 
{ 
    $awards[] = $row; 
} 

$asql = "SELECT * FROM (awards, rosters) 
inner join ranks on ranks.id=rosters.rankid 
inner join user_awards on user_awards.award_id=awards.id 
where rosters.ruser_id = user_awards.user_id AND rosters.rplatoon='viking' 
GROUP BY rosters.rname 
ORDER BY rosters.rname"; 
$aresults = mysqli_query($con, $asql); 
if(!$aresults and $mysqliDebug) { 
    echo "<p>There was an error in query:". $aresults."</p>"; 
    echo $con->error; 
} 

$uawards = array(); 
while ($arow = mysqli_fetch_assoc($aresults)) 
{ 
    $uawards[] = $arow; 
} 
?> 

<table > 
    <thead> 
     <tr> 
      <th>Rank/Name</th> 
      <?php foreach ($awards as $award) 
      { 
       if ($award['category'] == 'medal') 
       { 
        echo '<th style="text-align:center;"> 
           <div class="tooltip4"> 
            <div id="award-'. $award['image_name'] . '3">&nbsp;</div> 
            <span class="tooltiptext4">'. $award['award_name'] .'</span> 
           </div> 
          </th>'; 
        } 
       } 
      ?> 


      </tr> 
     </thead> 
     <tbody> 
      <?php foreach ($uawards as $users) 
      { 
       echo '<tr><td>' . $users['name'] . ' '. $users['rname'] . '</td>'; 
        $medal = 0; 
        foreach ($awards as $award) 
        { 
          if ($award['category'] == 'medal') 
          { 
           if ($award['id'] == $users['award_id']) 
           { 
            $awardid = $users['award_id']; 
            if ($awardid == 26) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 27) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 28) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 29) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 30) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 31) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 32) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 33) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 34) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 35) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 36) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 37) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 38) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 39) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif ($awardid = 40) 
            { 
             echo '<td>True</td>'; 
            } 
            elseif (!$awardid) 
            { 
             echo '<td>True</td>'; 
            } 
           } 
           else 
           { 
            echo '<td>False</td>'; 
           } 
          } 
         } 
         echo '</tr>'; 
        } 
      ?> 
    </tbody> 
</table> 

Hier ist das Ergebnis

enter image description here

Ich hoffe, dass ich das richtig formuliert.

Vielen Dank im Voraus

Antwort

1
$asql = SELECT user_id,GROUP_CONCAT(award_id SEPARATOR ',') as awards FROM user_awards GROUP BY user_id 
$aresults = mysqli_query($con, $asql); 

Es gibt 1 Zeile in einem Komma getrennt (In awards26,27,28,29,30,31 gegen user_Id1) Verwendung explode Funktion und in_array()

<table > 
     <thead> 
     <tr> 
      <th>Rank/Name</th> 
      <?php foreach ($awards as $award) 
      { 
       if ($award['category'] == 'medal') 
       { 
        echo '<th style="text-align:center;"> 
        <div class="tooltip4"> 
         <div id="award-'. $award['image_name'] . '3">&nbsp;</div> 
         <span class="tooltiptext4">'. $award['award_name'] .'</span> 
        </div> 
        </th>'; 
       } 
      } 
      ?> 
     </tr> 
    </thead> 
    <tbody> 
     while($arow = mysqli_fetch_assoc($aresults) 
     { 
      <tr> 
       $award=explode(',',$arow['awards'])?> 
       <td> 
       <?php 
        if (in_array("26", $award)) echo "true"; 
        else echo "false"; 
       ?> 
       </td> 
       <td><?php 
        if (in_array("27", $award)) echo "true"; 
        else echo "false"; 
       ?></td> 
      </tr> 
     }?> 
    </tbody> 
<table> 

dies ein Beispiel für zwei Spalten, für weitere Spalten fügen sie while loop

<td><?php 
    if (in_array("award_id", $award))`replace award_ids to your table Ids` 
     echo "true"; 
    else echo "false"; 
    ?> 
</td> 
+0

Danke, ju Was ich gesucht habe <3 – Ryahn

1
SELECT user_id,GROUP_CONCAT(award_id SEPARATOR str_val ',') 
FROM user_awards 
GROUP BY user_id 

Dadurch werden alle Auszeichnungen geben, die der Benutzer in einem Komma getrennt Spalte in 1 Zeile hat. Weitere Joins zum rosters-Tisch können von hier aus gemacht werden und mit Joins zur awards-Tabelle ist es möglich, den Award-Namen zusammen mit der award_id dem GROUP_CONCAT hinzuzufügen.

0

@Mohamed Yasin Ich stimme Ihrer Anfrage zu. Aber es gibt eine Begrenzung in GROUP_CONCAT,

@Ryahn Sie können die Einstellung GROUP_CONCAT erhöhen, indem Sie group_concat_max_len verwenden. Also solltest du so verwenden.

SET SESSION group_concat_max_len = 1000000; // set value according to requirement. Default is 1024 

es ist eine temporäre, Sitzung-Bereich, Einstellung. Es gilt nur für die aktuelle Sitzung. Sie sollten es so verwenden.

SET SESSION group_concat_max_len = 1000000; 
SELECT user_id,GROUP_CONCAT(award_id SEPARATOR str_val ',') 
FROM user_awards 
GROUP BY user_id 

Sie können dies auch in Shared-Hosting, aber wenn Sie eine andere Sitzung zu verwenden, müssen Sie die SET-SESSION Befehl wiederholen.

Der Maximalwert für group_concat_max_len ist 18446744073709551615.

Sie auch weitere Konfiguration von MYSQL auf diesen Link sehen. https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_group_concat_max_len

Dort können Sie Minimum, Maximum, Standardwert sehen, ob Sie sie global oder pro Sitzung festlegen, ob Sie sie auf einer laufenden Instanz ändern oder es einen Neustart und andere Beschreibung der Verwendung erfordert.

Ich hoffe, das wird helfen.

Verwandte Themen