Autor Zpráva
Dědeček
Profil *
Dobrý večer,

Nevíte prosím když mám tabulku s hodnotami a ty pak nasledne vypisuji viz. kód
$var=mysql_query("SELECT * FROM users ORDER BY points LIMIT 20") or die (mysql_error());
  while ($get = mysql_fetch_array($var))
  {
  $profile_pic=$get["profile_pic"];
  $name=$get["name"];
  $points=$get["points"];
  echo '<tr><td><img src="'.$profile_pic.'" width="20px" /></td><td>'.$name.'</td><td>'.$points.'</td></tr>';
  }
  echo '</table>';


a pred ten img potrebuji dat bunku s poradim ale zaboha nevim jak pouzit DENSE_RANK() na points tak aby se mi vypisovalo cislo poradi.

Dekuji za radu

#Topic jsem poslal do sekce PHP, ale tam asi nidko nebude vědět, proto posílám sem omlouvám se pokud jsem porušil nějaká pravidla (http://diskuse.jakpsatweb.cz/?action=vthread&forum=9&topic=118908)


Moderátor panther: Příště nezakládej duplicity a požádej o přesun. Jinak budeš bit.
Dědeček
Profil *
Tak jsem hodim jeden priklad, ale nefunguje, bud jsem to pochopil spatne nebo tam mam chybu :)
  $var=mysql_query("SELECT *, dense_rank() over (order by points desc) AS rank FROM users ORDER BY points DESC LIMIT 10") or die (mysql_error());
  while ($get = mysql_fetch_array($var))
  {
  $profile_pic=$get["profile_pic"];
  $name=$get["name"];
  $points=$get["points"];
  $rank=$get["rank"];
  echo '<tr><td>'.$rank.'.</td><td><img src="'.$profile_pic.'" width="20px" /></td><td>'.$name.'</td><td>'.$points.'</td></tr>';
  }


Vypisuje chybu
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(order by points desc) AS rank FROM users ORDER BY points DESC LIMIT 10' at line 1
Kajman_
Profil *
Kde jste se dočetl, že tohle mysql umí?

Co si jen přičítat jedničku v php?

  $rank=0;
  while ($get = mysql_fetch_array($var))
  {
    $rank++; 
Dědeček
Profil *
Takhle jsem to včera vyřešil to není problém, ale problém je jinde. Mám vypsáno těch prvních 20, potom je <hr /> a poté je vypsán přihlášený uživatel, aby veděl jaké je jeho pořadí když není v top 20. No a jak získat jeho pořadí? Ledaže udělat stejný cyklus a data vypisovat tehdy když se profile_id rovná tomu přihlášenému. Bude to ale pomalé ne? :)
Dědeček
Profil *
Tak jo takže jsem to udělal takto.

 $rank=0;
  echo '<table>';
  echo '<tr><td>Pořadí</td><td>Jméno</td><td>Body</td></tr>';
  echo '<tr><td><hr /></td><td><hr /></td><td><hr /></td></tr>';
  $var=mysql_query("SELECT * FROM users ORDER BY points DESC LIMIT 10") or die (mysql_error());
  while ($get = mysql_fetch_array($var))
  { 
  $rank++;
  $name=$get["name"];
  $points=$get["points"]; 
  echo '<tr><td>'.$rank.'.</td><td>'.$name.'</td><td>'.$points.'</td></tr>';
  }
  echo '<tr><td><hr /></td><td><hr /></td><td><hr /></td></tr>';
  $rank=0;
  $var=mysql_query("SELECT * FROM users ORDER BY points DESC") or die (mysql_error());
  while ($get = mysql_fetch_array($var))
  { 
  $rank++;
  $id=$get["profile_id"];
  if($id==$profile_id)
  {$name=$get["name"];
  $points=$get["points"]; 
  echo '<tr><td>'.$rank.'.</td><td>'.$name.'</td><td>'.$points.'</td></tr>';
  }
  }
  echo '</table>';

Jenže u druhého cyklu to bude dosti pomalé když tam bude třeba 50 000 řádků ne?
xmark
Profil
Dědeček:
Dva dotazy budou lepší. V prvním LIMIT 20, v druhém WHERE ID = ..
Dědeček
Profil *
xmark:
Teď nevím jak to myslíš
Kajman_
Profil *
No a jak získat jeho pořadí?

Spočítáte, kolik lidí je před ním a přitete jedničku.

select count(*)+1 as poradi from `users` where `points`>'$pointy_prihlaseneho_uzivatele'
Dědeček
Profil *
No a když bude mít 0. a více uživatelů bude mít 0? Nebo více uživatelů bude mít stejný počet bodů jaké tam bude číslo?
Kajman_
Profil *
jaké tam bude číslo?
budou mít stejné čístlo -- (počet lidí, co mají víc než 0) + 1
Dědeček
Profil *
Dobře takhle mi to funguje, nevíte jak to vypsat jednoduseji nez pres pole?
$var=mysql_query("SELECT * FROM users WHERE profile_id=$profile_id") or die (mysql_error());
  while ($get = mysql_fetch_array($var))
  { 
  $id=$get["profile_id"];
  if($id==$profile_id)
  {$name=$get["name"];
  $points=$get["points"]; 
  $rank=mysql_fetch_array(mysql_query("select count(*)+1 from users where points>'$points'"));
  echo '<tr><td>'.$rank[0].'.</td><td>'.$name.'</td><td>'.$points.'</td></tr>';
  }
Dědeček
Profil *
Takže tak :)
$rank=mysql_result(mysql_query("select count(*)+1 from users where points>'$points'"),0,0);
Kajman_
Profil *
Nevím, jak jednoduššeji to chcete dělat, třeba se Vám to bude více líbit s použitím mysql_result. Ale osobně bych spíše zaměnil while za if.
Joker
Profil
Kajman:
osobně bych spíše zaměnil while za if.
A já bych ještě vyhodil podmínku na řádku 5.
Řekl bych, že databázi se dá věřit natolik, že SELECT … WHERE profile_id=$profile_id skutečně vrátí řádek s profile_id rovným $profile_id.
Dědeček
Profil *
Joker:
Vidíte na to jsem zapomněl, děkuji. Takže výsledek je. Jak myslíte WHILE za IF?
$var=mysql_query("SELECT * FROM users WHERE profile_id=$profile_id") or die (mysql_error());
  while ($get = mysql_fetch_array($var))
  { 
  $id=$get["profile_id"];
  $name=$get["name"];
  $points=$get["points"]; 
  $rank=mysql_result(mysql_query("select count(*)+1 from users where points>'$points'"),0,0);
  echo '<tr><td>'.$rank.'.</td><td>'.$name.'</td><td>'.$points.'</td></tr>';
  }
Dědeček
Profil *
Aha teoreticky se vypisuje jenom jeden řádek, takže je tam while zbytečně :)
Kajman_
Profil *
Pokud ten rank vytahuje u toho přihlášeného uživatele vždy, tak se to dá spláchnout oboje i jedním dotazem...
$var=mysql_query("SELECT u.*, (select count(*)+1 from users u2 where u2.points>u.points) rank  FROM users u WHERE u.profile_id=$profile_id") or die (mysql_error());
  if ($get = mysql_fetch_array($var))
  { 
    echo '<tr><td>'.$get["rank"].'.</td><td>'.$get["name"].'</td><td>'.$get["points"].'</td></tr>';
  }

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0