2016-09-16 2 views
-1

안녕하세요, 저는 데이터베이스에서 5 개의 임의의 행을 가져 와서 표시하려고합니다. 나는 현재 이렇게하지만 중복 결과가 발생합니다.PHP mysql 임의의 행이 중복되지 않습니다.

한계를 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

이 왜 5 개 결과 (LIMIT 5) 및 루프이를 요청하려고하지 말자 :

귀하의 쿼리는 다음과 같이해야 하는가? 중복을 반환하지 않습니다. 4 개의 쿼리를 줄이면 부작용이 발생합니다.

$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']); 
관련 문제