使用重复的用户ID

时间:2016-08-29 05:03:42

标签: php mysql

我有一个表设置,用户ID跟踪奖励。将有多个具有相同用户ID但奖励不同的记录。

当前数据库

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

我正在使用的当前代码无法向用户显示记录。它只会抓取一个结果。我已经尝试删除GROUP BY,但它需要将所有记录保存到一行中,并带有多个结果。

$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

我希望我说得对。

提前致谢

3 个答案:

答案 0 :(得分:1)

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

这将为用户在逗号分隔列中的一行提供所有奖励。可以从这里进一步加入名单表,并使用联接到奖励表,可以将奖励的名称与award_id一起添加到GROUP_CONCAT。

答案 1 :(得分:1)

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

它以逗号分隔1行(awards 26,27,28,29,30,31user_Id 1对齐 使用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>

这是两列的示例,对于更多列,添加while循环

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

答案 2 :(得分:0)

@Mohamed Yasin我同意你的疑问。但是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的最大值是18446744073709551615。

您还可以在此链接上看到更多MYSQL配置。 https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_group_concat_max_len

在那里,您可以看到最小值,最大值,默认值,是否可以全局或按会话设置它们,是否可以在正在运行的实例上更改它们,还是需要重新启动,以及其他使用说明。

我希望这会有所帮助。