2016-09-16 51 views
-1

嗨即時嘗試從數據庫中獲得5個隨機行,然後顯示它們。我目前這樣做,但它確實導致重複。php mysql random rows no duplicates

我需要將限制更改爲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++; 
     } 
    } 
    } 
} 
+2

使用DISTINCT和/或GROUP BY 。 –

+0

'ORDER BY RAND()LIMIT 5;'是最好的方式 – CatalinB

+0

我可以問另一個問題,而我在這裏。我如何使提交按鈕對每一行都是唯一的?所以我可以用它來傳遞變量 – GregHBushnell

回答

1

爲什麼dont't你嘗試請求5個結果(LIMIT 5)和環路呢?它不會返回任何重複。減少四個查詢將是一個副作用。

$sql = "SELECT * FROM userstats ORDER BY RAND() LIMIT 5; "; 
while($row = mysqli_fetch_assoc($result)){ 
... 
} 
+1

非常感謝你,我正在尋找。我的印象是,我不得不將$ row = mysqli_fetch_assoc($ result)改爲別的東西。但現在我知道它可以這樣工作,我也可以用它來做其他事情 – GregHBushnell

0

而不是在循環內調用查詢5次,你應該有一個單一的查詢。這是最優化的方法。

您可以使用GROUP BY子句選擇唯一的行。

您的查詢應該是這樣的:

SELECT * 
FROM userstats 
GROUP BY username 
ORDER BY RAND() 
LIMIT 5 
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']);