php mysql随机行没有重复

时间:2016-09-16 16:32:58

标签: php html mysql

您好我试图从数据库中获取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++;
        }
    }
    }
}

3 个答案:

答案 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']);