Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Sprawdzenie najwyższego wyniku
Forum PHP.pl > Forum > Przedszkole
Watt
Witam,

Mam pytanie jak sprawdzić najwyższy wynik w dość nietypowej sytuacji.
Mam w bazie kolumnę USER_ID oraz PUNKT. Za napisanie każdego artykułu user dostaje dodatkowy punkt, w mysql mam z 300 wierszy i spośród nich chciałbym znaleźć osobę, która ma najwięcej punktów za artykuły. I tu jest problem bo gdy napiszesz 10 artów to w bazie pojawia się 10 wierszy z Twoim USER_ID. Jak sprawdzić osobę z największym wynikiem i najwyższy wynik (jego wynik)?

(Dodam, że niektóre arty są inaczej punktowane niż inne - jakby to miało w czymś pomóc)

Pozdrawiam!
phpion
Poczytaj o funkcjach agregujących w MySQL, a w szczególności o SUM(). Ponadto musisz użyć grupowania więc poczytaj również o GROUP BY. Nic więcej ci do szczęścia nie jest potrzebne.
Watt
Wiem, tylko głownie mam problem z tym, żeby porównać jednego usera z drugim. Chodzi o to, że ID nie są po kolei
Kod
$wynik = mysql_query("SELECT id_u, punkty FROM test");

while($r = mysql_fetch_array($wynik, MYSQL_ASSOC)){

echo $r["id_u"]." </br>";

$z[$r["id_u"]] = $z[$r["id_u"]] + $r["punkty"];

if($z[$r["id_u"]] > $z[$r["id_u"]- 1])
$najwyzsza = $r["id_u"];

}
echo "Ten user to".$najwyzsza;


Nie mogę zrobic id_u - 1 bo id nie sa po kolei ; /
phpion
Pozwól, że się powtórzę: SUM() + GROUP BY.
Watt
Dobrze, ale ja nie rozumiem zastosowania w moim przypadku. Pogrupuje je, zsumuje i co? Mam problem z pobraniem ID gościa, który ma największą sumę - chyba, że źle zrozumiałem komendę mysql SUM ?

Wybaczcie, że tak spamuje, ale co mam zrobić, gdy nie widzę związku - za słabo nam php i mysql.
phpion
Sumujesz punkty wszystkich użytkowników, sortujesz wynik po tej sumie malejąco i wybierasz pierwszy rekord. Tyle. W uproszczeniu tak to ma wyglądać:
  1. SELECT ... SUM(punkty) ... GROUP BY id_uzytkownika ORDER BY SUM(punkty) DESC LIMIT 1
Watt
Czyli to by wyglądało tak:

Kod
$wynik = mysql_query("SELECT id_u FROM test SUM(punkty) GROUP BY id_uzytkownika ORDER BY SUM(punkty) DESC LIMIT 1  ");
while($r = mysql_fetch_array($wynik, MYSQL_ASSOC)){

echo $r["id_u"]." </br>";

}


I pierwszym wynikiem $r["id_u"] będzie id usera z najwyższą ilością ?
porady-it.pl
Blisko:

  1. SELECT id_u FROM test GROUP BY id_u ORDER BY SUM(punkty) DESC LIMIT 1


PS.

Nie musisz umieszczać tego w pętli bo i tak masz tylko jeden rekord winksmiley.jpg

  1. <?php
  2. require('config.php');
  3.  
  4. $wynik = mysql_fetch_assoc(mysql_query("SELECT id_u FROM test GROUP BY id_u ORDER BY SUM(punkty) DESC LIMIT 1  "));
  5.  
  6.  
  7. echo $wynik["id_u"]." </br>";
  8. ?>
Watt
Okej, a gdy chcę pokazać punkty?
Kod
$wynik = mysql_query("SELECT id_u, SUM(punkty) FROM test GROUP BY id_u ORDER BY SUM(punkty) DESC LIMIT 1  ");

$r = mysql_fetch_array($wynik, MYSQL_ASSOC);


echo $r["id_u"]." ".$r["punkty"];


Tak jakoś nie chce działać ;/
phpion
Ehhh... dodaj alias do SUM(punkty) czyli:
  1. <?php
  2. $wynik = mysql_query("SELECT id_u, SUM(punkty) AS suma_punktow FROM test GROUP BY id_u ORDER BY SUM(punkty) DESC LIMIT 1  ");
  3.  
  4. $r = mysql_fetch_array($wynik, MYSQL_ASSOC);
  5.  
  6.  
  7. echo $r["id_u"]." ".$r["suma_punktow"];
  8. ?>
Watt
Dziękuję Ci za pomoc!
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.