Php 在一行中显示具有重复用户id的多条记录
我有一个表格设置,通过用户id跟踪奖励。将有多个记录具有相同的用户id,但奖励不同 当前数据库Php 在一行中显示具有重复用户id的多条记录,php,mysql,Php,Mysql,我有一个表格设置,通过用户id跟踪奖励。将有多个记录具有相同的用户id,但奖励不同 当前数据库 +---------+----------+---------------------+ | user_id | award_id | award_date | +---------+----------+---------------------+ | 1 | 26 | 2016-08-20 00:00:00 | | 1 | 27 |
+---------+----------+---------------------+
| 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 |
+---------+----------+---------------------+
我使用的当前代码无法向用户显示记录。它只会获得一个结果。我已尝试按删除组,但它需要将所有记录保留在一行中,并显示多个结果
$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"> </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>
$sql=“按id ASC从奖励订单中选择*”;
$results=mysqli_查询($con,$sql);
$awards=数组();
while($row=mysqli\u fetch\u assoc($results))
{
$awards[]=$row;
}
$asql=“从(奖项、名册)中选择*
在列组上加入内部列组。id=rosters.rankid
用户奖励上的内部加入用户奖励。奖励\u id=awards.id
其中,rosters.ruser\u id=user\u awards.user\u id和rosters.rplatoon='viking'
按rosters.rname分组
按名册排序;
$aresults=mysqli\u查询($con,$asql);
if(!$aresults和$mysqliDebug){
echo“查询中出现错误:“.$aresults。””;
echo$con->错误;
}
$uawards=array();
而($arow=mysqli\u fetch\u assoc($aresults))
{
$uawards[]=$arow;
}
?>
职级/姓名
结果如下
我希望我的措辞是正确的
提前谢谢
SELECT user_id,GROUP_CONCAT(award_id SEPARATOR str_val ',')
FROM user_awards
GROUP BY user_id
这将在逗号分隔的列中给出用户在一行中获得的所有奖励。可以从此处进一步连接到名册表,并使用到奖励表的连接,可以将奖励的名称与奖励id一起添加到组CONCAT。@Mohamed Yasin我同意您的查询。但在组_CONCAT中存在局限性 @Ryahn您可以使用
GROUP\u CONCAT\u max\u len
增加GROUP\u 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 = 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命令
组_concat_max_len的最大值为18446744073709551615
您还可以在这个链接上看到更多的MYSQL配置。
在那里,您可以看到最小值、最大值、默认值、是否可以全局设置它们或每个会话设置它们、是否可以在正在运行的实例上更改它们或是否需要重新启动以及其他使用说明
我希望这会有所帮助
$asql = SELECT user_id,GROUP_CONCAT(award_id SEPARATOR ',') as awards FROM user_awards GROUP BY user_id
$aresults = mysqli_query($con, $asql);
它以逗号分隔的形式给出了1行(在奖励
26,27,28,29,30,31
与用户Id
1
)
在数组()中使用explode
函数和
谢谢,这正是我想要的