Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Pozycja w rankingu
Forum PHP.pl > Forum > Przedszkole
Daav
Witam wszystkich, oto moja tabela `player`:

id | name | race | level | exp | max_level

A to rekordy:

1 Gracz1 Druid 99 23398 0
2 Gracz2 Rycerz 25 5342 0
3 Gracz3 Mag 100 0 3
4 Garcz4 Druid 100 0 2
5 Gracz5 Rycerz 100 0 1
6 Gracz6 Mag 100 0 4
7 Gracz7 Rycerz 25 100 0

Małe objaśnienie. ID to wiadomo, race to profesja, level = poziom (maksymalny to 100), exp wiadomo i max_level to informacja dla mnie, kto wbił pierwszy maksymalny poziom.

Problem w tym, że chciałbym wyciągnąć, najlepiej jednym złożonym zapytaniem, ranking danej postaci na kilka sposbów. *1) Ranking w klasach postaci i *2) ogólny, na poziom.

*1) Przykład:

Gracz1 ranking klasy: 2 - bo Gracz4 ma wyższy poziom.
Gracz3 ranking klasy: 1 - bo Gracz 6 wbił maksymalny poziom później.
Gracz7 ranking klasy: 3 - ma taki sam poziom jak Gracz2, ale mniej expa

*2)

Gracz5 ogólny ranking: 1 - bo ma najwyzszy poziom i wbił go pierwszy.
Gracz6 ogólny ranking: 4 - ma najwyzszy poziom ale wbił go jako 4.
Gracz7 ogólny ranking: 7 - ma taki sam poziom jak Gracz2, ale mniej expa

Przeszukałem forum, googlowałem, ale nie mogę znaleźć rozwiązania sad.gif

Dzięki za jakąkolwiek pomoc.
JakubBab
Uzupelnij swimi danymi gdzie trzeba:

  1. <?php
  2.  
  3.  
  4. class connection{
  5.  
  6. public function connect($dbn,$us,$pass){
  7. $dsn = 'mysql:dbname='.$dbn.';host=127.0.0.1';
  8. $user = $us;
  9. $password = $pass;
  10.  
  11. $options = array(
  12. PDO::ATTR_PERSISTENT => true,
  13. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  14. );
  15. try {
  16. $db = new PDO($dsn, $user, $password, $options);
  17. } catch (PDOException $e) {
  18. echo 'Connection failed: ' . $e->getMessage();
  19. }
  20.  
  21. return $db;
  22. }
  23.  
  24. }
  25.  
  26. class getData {
  27.  
  28. public function fetch($param = '') {
  29.  
  30. $conn = new connection();
  31. $db = $conn->connect($dbn,$us,$pass);
  32.  
  33.  
  34. if($param !=''){
  35. $sql = "SELECT `id`,`name`,`level`,`max_level`from `game` where race = '" . $param . "' order by level DESC, max_level asc ";
  36. }else{
  37. $sql = "SELECT `id`,`name`,`level`,`max_level`from `game` order by level DESC, max_level asc ";
  38. }
  39.  
  40.  
  41.  
  42.  
  43.  
  44. $query = $db->prepare($sql);
  45. $query->execute();
  46.  
  47. $result = $query->fetchAll(PDO::FETCH_ASSOC);
  48.  
  49. return $result;
  50. }
  51.  
  52. public function classRanking($tab = '') {
  53.  
  54.  
  55.  
  56. // $tab != '' ? $data = $this->fetch($tab) : $data = $this->fetch();
  57.  
  58. if ($tab != '')
  59. {
  60. $data = $this->fetch($tab);
  61. $describe = " ogolny ranking klasy: ";
  62. } else{
  63.  
  64. $data = $this->fetch();
  65. $describe = " ogolny ranking";
  66. }
  67.  
  68.  
  69.  
  70. $counter = 1;
  71. $toCompare = '';
  72.  
  73. foreach ($data as $key => $val) {
  74. foreach ($val as $par => $info) {
  75.  
  76. }
  77. $toCompare .= $val['name'] . $describe. $counter++ . "</br>";
  78. }
  79. print_r($toCompare);
  80. }
  81.  
  82.  
  83. }
  84.  
  85. $test = new getData;
  86. $test2 = new getData;
  87.  
  88. $test->classRanking('Druid');
  89.  
  90. echo (str_repeat("</br>", 6));
  91. $test2->classRanking();
  92.  
  93. ?>
trueblue
Opisałeś to w tak zagmatwany sposób, że trudno się połapać.
Lepiej gdybyś podał pierwsze miejsca w każdej grupie, a w drugim przykładzie 3 kolejne miejsca.

Spróbuj:
1:
  1. SELECT id,race,rank
  2. FROM(
  3. SELECT IF(@racegroup<>race,@rank:=0,true),IF(@racegroup<>race,@racegroup:=race,true),gracz.*,@rank:=@rank+1 AS rank FROM gracz,(SELECT @rank:=0) AS t1,(SELECT @racegroup:='') AS t2
  4. ORDER BY race,level DESC,exp,max_level
  5. ) AS tmp
  6. WHERE rank=1


2:
  1. SELECT id,race,rank
  2. FROM(
  3. SELECT gracz.*,@rank:=@rank+1 AS rank FROM gracz,(SELECT @rank:=0) AS t1
  4. ORDER BY level DESC,exp,max_level
  5. ) AS tmp
  6. WHERE rank<=(SELECT count(DISTINCT race) FROM gracz)


lub ilość grup na sztywno:
  1. SELECT * FROM gracz
  2. ORDER BY level DESC,exp,max_level
  3. LIMIT 0,3
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.