我有一个表设置,用户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"> </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>
结果如下
我希望我说得对。
提前致谢
答案 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,31
与user_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"> </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
在那里,您可以看到最小值,最大值,默认值,是否可以全局或按会话设置它们,是否可以在正在运行的实例上更改它们,还是需要重新启动,以及其他使用说明。
我希望这会有所帮助。