您好我试图从数据库中获取5个随机行,然后显示它们。我目前这样做但它确实导致重复。
我需要将限制更改为5,然后将它们存储在数组中,但我该怎么做?还是有更好的方法?
function GetPlayer($link){
if (isset($_SESSION['username'])) {
$x = 0;
while($x <= 5) {
$sql = "SELECT * FROM userstats ORDER BY RAND() LIMIT 1; ";
$result = mysqli_query($link,$sql);
$row = mysqli_fetch_assoc($result);
if($row['username'] !== $_SESSION['username']){//add so it dosent put duplicates
echo ("<tr>");
echo ("<th>".$row['username']." </th>");
echo ("<th>Level: ".$row['Level']." </th>");
echo ("<th>Player Stats:".$row['Attack']."/".$row['Defence']." </th>");
echo ("<th>Win Chance: ");
echo CalculateWinChance($link,$row['Defence']);
echo ("<th><input type ='submit' name = 'Attack_Btn' value ='Attack'></th>");
echo ("</tr>");
$x++;
}
}
}
}
答案 0 :(得分:1)
为什么你不尝试请求5个结果(LIMIT 5)并循环这个?它不会返回任何重复。减少四个查询会产生副作用。
$sql = "SELECT * FROM userstats ORDER BY RAND() LIMIT 5; ";
while($row = mysqli_fetch_assoc($result)){
...
}
答案 1 :(得分:0)
您应该只有一个查询,而不是在循环中调用查询5次。这是最优化的方法。
您可以使用GROUP BY子句选择唯一的行。
您的查询应如下所示:
SELECT *
FROM userstats
GROUP BY username
ORDER BY RAND()
LIMIT 5
答案 2 :(得分:0)
您希望清理查询中的输入和/或使用prepared statement,但这应该让您非常接近您想要的内容:
$sql = 'SELECT * FROM userstats WHERE username != ? GROUP BY username ORDER BY RAND() LIMIT 5';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $_SESSION['username']);