Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyciagniecie wartosci z bazy danych i podanie ktorą jest z kolei
Forum PHP.pl > Forum > PHP
arfer
Witam
Mam 2 kolumny w tabeli bazy danych: uzytkownik i wartosc w liczbach
Chcialbym wyciagnac informacje ktora z kolei jest wybrana przeze mnie wartosc.
Przyklad:

ID uzytkownika - Wartosc
1 - 5
2 - 3
3 - 8
4 - 10

Przy ograniczeniu id wybranego przeze mnie uzytkownika ( uzytkownik_id='".$_GET['uzytkownik_id']."' ) dla powiedzmy id 3 wyciagnieta wartoscia bedzie 8. Moje pytanie brzmi czy jest jakies zapytanie ktore policzyloby ktora w kolejnosci od najmniejszej do najwiekszej jest to wartosci czyli przy moich wartosciach 3-5-8-10 jest 3 wartoscia i zwroci mi '3'

pozdrawiam smile.gif
Niktoś
Musiałbyś przerobić na własny użytek i przetestować.
  1. SELECT wartosc,count(wartosc) AS ile WHERE uzytkownik_id='".$_GET['uzytkownik_id']."' AND wartosc<=$Twoja_Podana_Wartosc ORDER BY wartosc ASC
arfer
Nie bardzo rozumiem roznicy miedzy wartosc a twojapodanawartosc.

Wartosc to nazwa kolumny wiec przy ograniczeniu uzytkownika moja podana wartoscia bedzie po prostu select wartosc. Natomiast wartosc poczatkowa ma byc najwieksza wartoscia wiec domyslam sie ze max(wartosc)? Ale wtedy powinien byc znak wiekszosci a nie mniejszosci. Idac tym tropem zrobilem takie oto zapytanie:

  1. (SELECT count(wartosc) FROM ".DB_WYNIKI." WHERE uzytkownik_id='".$_GET['uzytkownik_id']."' AND max(pkt)>=(pkt) ORDER BY wartosc ASC) AS ile


Niestety zwraca mi taki oto komunikat : Invalid use of group function

Co zrobilem zatem zle? Z pewnoscia duzo zlych rzeczy wink.gif

Niktoś
To źle zrozumiałem,myślałem ,że wartość także sobie ustalasz,heh wpoprzednim poście zapomniałem o from:

Cytat
SELECT wartosc,count(wartosc) AS ile FROM DB_WYNIKI WHERE uzytkownik_id='".$_GET['uzytkownik_id']."' ORDER BY wartosc ASC
arfer
A jak to zapisac z SUMą bo tych wartosci nie mam fizycznie w bazie danych jest ich bardzo duzo i korzystam z funkcji SUM ktora sumuje mi wszystkie wartosci poszczegolnych uzytkownikow.
Probowalem tak ale zwraca blad, chyba taki zapis jest niepoprawny (przy samym wartosc dziala ale nie o to mi za bardzo chodzi smile.gif )

  1. (SELECT count SUM(wartosc) FROM ".DB_WYNIKI." WHERE uzytkownik_id='".$_GET['uzytkownik_id']."' ORDER BY (SUM)wartosc ASC) AS ile
mortus
@Niktoś: Zaproponowane przez Ciebie rozwiązanie w ogóle nijak się ma do przedstawionego problemu.

@arfer: Zapytanie, które zrobi to co chcesz do prostych nie należy i pewnie nie będzie zbyt optymalne, niemniej wyglądałoby ono tak:
  1. SELECT * FROM (
  2. SELECT @i := @i + 1 AS pozycja, delivered1.uzytkownik_id, delivered1.suma FROM (SELECT @i := 0) AS init_position, (
  3. SELECT uzytkownik_id, SUM(wartosc) AS suma FROM DB_WYNIKI GROUP BY uzytkownik_id ORDER BY suma ASC
  4. ) AS delivered1
  5. ) AS delivered2 WHERE delivered2.uzytkownik_id = $_GET['uzytkownik_id']

a jako zmienna w PHP:
  1. $sql = "SELECT * FROM (
  2. SELECT @i := @i + 1 AS pozycja, delivered1.uzytkownik_id, delivered1.suma FROM (SELECT @i := 0) AS init_position, (
  3. SELECT uzytkownik_id, SUM(wartosc) AS suma FROM " . DB_WYNIKI . " GROUP BY uzytkownik_id ORDER BY suma ASC
  4. ) AS delivered1
  5. ) AS delivered2 WHERE delivered2.uzytkownik_id = " . $_GET['uzytkownik_id'];


Przy czym strukturę tabeli DB_WYNIKI wywróżyłem z fusów, a że wróżką najlepszą nie jestem to i zapytanie może nie zadziałać wink.gif Jeśli nie zadziała, to podaj strukturę tabeli DB_WYNIKI. Jeśli natomiast zadziała, to pozostaje jeszcze kwestia sprawdzenia optymalności, bo może szybciej byłoby skorzystać tutaj z funkcji PHP operujących na tablicach.
arfer
Hmm no juz od samego przeczytania glowa mnie rozbolala ale zaraz pokombinuje wcielic to w zycie i dam znac smile.gif
Swoja droga wydawalo mi sie to z teoretycznego punktu widzenia proste w realizacji. Tymbardziej ze utworzylem sobie inne zapytanie w osobnej stronie ktore sumowalo mi wyniki wszystkich uzytkownikow i przedstawialo posortowane w formie tabeli wykorzystujac $lp mialem przy kazdym kolejna liczbe porzadkowa ktora jest szukana przeze mnie wartoscia. Ta liczba porzadkowa to wlasnie pozycja w kolejnosci od najwiekszego do najmniejszego. Myslalem ze jesli tak latwo mozna cos takeigo zrobic w formie tabeli to rownie latwo bedzie wyciagnac ta liczbe porzadkowa z wybranego uzytkownika wink.gif
mortus
Cytat(arfer @ 1.05.2012, 23:11:29 ) *
Hmm no juz od samego przeczytania glowa mnie rozbolala ale zaraz pokombinuje wcielic to w zycie i dam znac smile.gif
Swoja droga wydawalo mi sie to z teoretycznego punktu widzenia proste w realizacji. Tymbardziej ze utworzylem sobie inne zapytanie w osobnej stronie ktore sumowalo mi wyniki wszystkich uzytkownikow i przedstawialo posortowane w formie tabeli wykorzystujac $lp mialem przy kazdym kolejna liczbe porzadkowa ktora jest szukana przeze mnie wartoscia. Ta liczba porzadkowa to wlasnie pozycja w kolejnosci od najwiekszego do najmniejszego. Myslalem ze jesli tak latwo mozna cos takeigo zrobic w formie tabeli to rownie latwo bedzie wyciagnac ta liczbe porzadkowa z wybranego uzytkownika wink.gif

Kolego zmienna $lp była zapewne w opisanej sytuacji licznikiem pętli np. for i w ogóle nie miała nic wspólnego z danymi pobranymi z bazy danych, ale tutaj znowu zgaduje, bo kodu nie mam, żeby się nim "podeprzeć". Wyświetlanie wyników po kolei, a ustalenie kolejności wyników, to dwie różne rzeczy.
arfer
Naturalnie ze tak smile.gif Mialem jedynie nadzieje ze istnieje latwy sposob by zrobic takie zapytanie "w locie" i sprawdzic ktora z kolei jest to wartosc.

Podanych przez ciebie kodow nie rozumiem, wstawiam je na strone w takiej postaci i zwraca mi blad
  1. Parse error: syntax error, unexpected '@'
mortus
Pokaż, jak wstawiasz.
arfer
Kopiuj wklej to co podales tongue.gif
mortus
Jednak nalegam, skopiuj i wklej to co masz.
arfer
Narazie wstawilem w plik php samo twoje zapytanie bez zadnych dodaktowych dzialan i po zapisaniu wyskakuje blad.

  1. $sql = "SELECT * FROM (
  2.  
  3. SELECT @i := @i + 1 AS pozycja, delivered1.uzytkownik_id, delivered1.suma FROM (SELECT @i := 0) AS init_position, (
  4.  
  5. SELECT uzytkownik_id, SUM(wartosc) AS suma FROM " . DB_WYNIKI . " GROUP BY uzytkownik_id ORDER BY suma ASC
  6.  
  7. ) AS delivered1
  8.  
  9. ) AS delivered2 WHERE delivered2.uzytkownik_id = " . $_GET['uzytkownik_id'];


lub

  1. $result = dbquery("SELECT * FROM (
  2.  
  3. SELECT @i := @i + 1 AS pozycja, delivered1.uzytkownik_id, delivered1.suma FROM (SELECT @i := 0) AS init_position, (
  4.  
  5. SELECT uzytkownik_id, SUM(wartosc) AS suma FROM DB_WYNIKI GROUP BY uzytkownik_id ORDER BY suma ASC
  6.  
  7. ) AS delivered1
  8.  
  9. ) AS delivered2 WHERE delivered2.uzytkownik_id = $_GET['uzytkownik_id']
  10.  
  11.  


Sam juz nie wiem jak to traktowac
mortus
Ale samego zapytania SQL nie możesz tak po prostu wkleić, bo dla interpretera PHP będzie to tylko bezsensowny ciąg bezsensownych znaków. Polecam zrobić to tak:
  1. $sql = "SELECT * FROM (
  2. SELECT @i := @i + 1 AS pozycja, delivered1.uzytkownik_id, delivered1.suma FROM (SELECT @i := 0) AS init_position, (
  3. SELECT uzytkownik_id, SUM(wartosc) AS suma FROM " . DB_WYNIKI . " GROUP BY uzytkownik_id ORDER BY suma ASC
  4. ) AS delivered1
  5. ) AS delivered2 WHERE delivered2.uzytkownik_id = " . $_GET['uzytkownik_id'];
  6. $jakas_tam_zmienna_ale_nie_wiem_jaka_bo_znowu_za_malo_kodu_podales = dbquery($sql) or die(mysql_error());
  7. // i dalej pętla, która to wyświetli
  8. while($data = dbarray($jakas_tam_zmienna_ale_nie_wiem_jaka_bo_znowu_za_malo_kodu_podales)) {
  9. // ...
  10. }

Można wtedy podejrzeć zapytanie, a w razie błędu w jego wykonaniu od razu uzyskujesz odpowiedni komunikat.

EDIT:
Pozmieniałem, bo przecież korzystasz z własnych funkcji do obsługi bazy danych ;P
arfer
Ok mam zapytanie do bazy danych a teraz jaki kod wyswietli ta wartosc bo juz sie pogubilem?

$sql
$jakas_tam_zmienna_ale_nie_wiem_jaka_bo_znowu_za_malo_kodu_podales

Zapytanie do bazy tworze przez:
$result = dbquery("SELECT wartosc");

petle
if(dbrows($result) > 0)
while ($data = dbarray($result))

wynik
".$data['wartosc']."

W twoim kodzie nic nie jest na miejscu nic nie rozumiem tongue.gif
mortus
Cytat(arfer @ 1.05.2012, 23:57:16 ) *
Ok mam zapytanie do bazy danych a teraz jaki kod wyswietli ta wartosc bo juz sie pogubilem?

$sql
$jakas_tam_zmienna_ale_nie_wiem_jaka_bo_znowu_za_malo_kodu_podales

Zapytanie do bazy tworze przez:
$result = dbquery("SELECT wartosc");

petle
if(dbrows($result) > 0)
while ($data = dbarray($result))

wynik
".$data['wartosc']."

W twoim kodzie nic nie jest na miejscu nic nie rozumiem tongue.gif
Zatem:
  1. $result = dbquery("SELECT * FROM (
  2. SELECT @i := @i + 1 AS pozycja, delivered1.uzytkownik_id, delivered1.suma FROM (SELECT @i := 0) AS init_position, (
  3. SELECT uzytkownik_id, SUM(wartosc) AS suma FROM " . DB_WYNIKI . " GROUP BY uzytkownik_id ORDER BY suma ASC
  4. ) AS delivered1
  5. ) AS delivered2 WHERE delivered2.uzytkownik_id = " . $_GET['uzytkownik_id']);
  6. if(dbrows($result) > 0) {
  7. while($data = dbarray($result)) {
  8. echo $data['pozycja'] . ' : ' . $data['uzytkownik_id'] . ' : ' . $data['suma'] . '<br />'; // itp.
  9. }
  10. }


EDIT:
Przy czym jeśli zależy Ci tylko i wyłącznie na pobraniu samej pozycji, a id użytkownika i suma jego wyników nie są istotne, to można skorzystać z innego zapytania.
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.