2016-08-29 6 views
3

私は、賞がユーザーIDによって追跡される場所をテーブル設定しました。同じユーザーIDを持つ複数のレコードがありますが、異なる賞があります。重複したユーザーIDを持つ1つの行に複数のレコードを表示

現在のデータベース

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

は、私が使用しています現在のコードは、ユーザーにレコードを表示することができません。結果は1つだけです。私はGROUP BYを削除しようとしましたが、複数の結果で1つの行にすべてのレコードを保持する必要があります。

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

はここで結果

enter image description here

私はこれを正しく文言を願っています。予め

おかげ

答えて

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

複数の列がそれらにwhileループを追加することは、(user_Id1に対してawards26,27,28,29,30,31で)カンマ区切りで 使用explode機能と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> 

この二列の例を1行を与えます

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

ありがとうございます私が探していたもの<3 – Ryahn

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

これは、ユーザがカンマ区切り列に1列に有するすべての賞を与えます。さらにロースターテーブルへのさらなる参加は、ここから行うことができ、また、award_idと一緒にGROUP_CONCATに賞の名前を追加することも可能です。

0

@モハメド・ヤシン私はあなたの質問に同意します。 GROUP_CONCATには制限があります。

@Ryahn group_concat_max_lenを使用してGROUP_CONCAT設定を増やすことができます。だから、このように使うべきです。

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

これは一時的なセッションスコープの設定です。現在のセッションのみに適用されます。このように使用する必要があります。

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

これは共有ホスティングでも実行できますが、他のセッションを使用する場合は、SET SESSIONコマンドを繰り返す必要があります。

group_concat_max_lenの最大値は、あなたはまた、このリンクをMYSQLのより多くの設定を見ることができます18446744073709551615.

です。そこ https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_group_concat_max_len

あなたはあなたが実行中のインスタンスにそれらを変更することができますか、それは再起動を必要としないかどうか、グローバルまたはセッションごとにそれらを設定し、使用方法の他の説明ができるかどうか、最小値、最大値、デフォルト値を見ることができます。

こちらがお役に立てば幸いです。

関連する問題