Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] Pozycja rekordu w zwracanych wynikach
Forum PHP.pl > Forum > Przedszkole
jajcarzd1
Witam

Mam pytanie czy istnieje jakiś operator, funkcja w mysql-u dzięki której mógłbym uzyskać informację na jakiej pozycji znajdzie się pewien rekord w zwróconych wynikach, przy założeniu oczywiście konkretnego ordera. Oczywiście mogę pobrac wszystkei dane i przelecieć sobie po tablicy wnikowej w php, ale interesuje mnie to czy mozna te dane pobrać już wcześniej w samym zapytaniu. Np. pobieram wszystkie dane w porządku rosnącym i na którym miejscu jest rekord o id 50.

Dzięki pozdro.
pgrzelka
hmm... rekord o id = 50 jest na pozycji 50 ? czy ja źle pytanie zrozumiałem ?
jajcarzd1
Cytat(pgrzelka @ 25.05.2009, 15:00:23 ) *
hmm... rekord o id = 50 jest na pozycji 50 ? czy ja źle pytanie zrozumiałem ?


No raczej źle zrozumiałeś. Id to kolejny nr który jest autoinkrementowany i jest np. kluczem głównym. Np w tabeli gallery będzie idgallery. Oczywiście jeśli będziemy dodawać kolejen rekordy i ich nie usuwać to powinno sięzgadzac ale jeśli usuniemy np 5 pierwszych to rekord o id 5 będzie już na pierwszy miejscu.
wookieb
Cytat(Spawnm @ 25.05.2009, 15:27:43 ) *


Czy ty wiesz co piszesz?

http://nospor.pl/mysql-faq-n25.html#faq-8
TheaSiX
możesz to zrobić przy użyciu while oraz iteracji (tak myślę):

  1. <?php
  2. $i = 0;
  3. $result = mysql_query("SELECT * FROM tabela ORDER BY kolumna");
  4. while($row = mysql_fetch_array($result))
  5. {
  6.    $id = $row["id/number/numer/etc."];
  7.    if($id == 50)
  8.    {
  9.        $pos = $i;
  10.    }
  11.    $i++;
  12. }
  13. ?>


Sprawdziłem u siebie i działa. Wystarczy, że przystosujesz na swoje potrzeby..
jajcarzd1
Cytat(TheaSiX @ 25.05.2009, 18:39:18 ) *
możesz to zrobić przy użyciu while oraz iteracji (tak myślę):

  1. <?php
  2. $i = 0;
  3. $result = mysql_query("SELECT * FROM tabela ORDER BY kolumna");
  4. while($row = mysql_fetch_array($result))
  5. {
  6.    $id = $row["id/number/numer/etc."];
  7.    if($id == 50)
  8.    {
  9.        $pos = $i;
  10.    }
  11.    $i++;
  12. }
  13. ?>


Sprawdziłem u siebie i działa. Wystarczy, że przystosujesz na swoje potrzeby..


Wiem że działa bo to żaden problem przelecieć po pętli i znaleźć swój rekord, ale jak zaznaczyłem na samym początku interesuje mnie rozwiązanie uzyskania takiego info przez samo zapytanie. Skorzystałem z linku podanego przez kolegę wookieb-a i tam znalazłem, rozwiązanie, które wkleję dla potomnych poniżej

  1. SET @id=5,@nr = 0, @idnr = 0;
  2. SELECT @idnr AS nr FROM
  3. (SELECT @nr:=@nr+1,IF(ID=@id, @idnr := @nr,@idnr=@idnr),ID FROM tabela WHERE jakiespole ='jakiswarunek' ORDER BY jakiespole jakiessortoanieASClubDESC) podsel WHERE podsel.ID = @id;


Dzięki i pozdro.

Cytat(jajcarzd1 @ 26.05.2009, 08:40:23 ) *
Wiem że działa bo to żaden problem przelecieć po pętli i znaleźć swój rekord, ale jak zaznaczyłem na samym początku interesuje mnie rozwiązanie uzyskania takiego info przez samo zapytanie. Skorzystałem z linku podanego przez kolegę wookieb-a i tam znalazłem, rozwiązanie, które wkleję dla potomnych poniżej

  1. SET @id=5,@nr = 0, @idnr = 0;
  2. SELECT @idnr AS nr FROM
  3. (SELECT @nr:=@nr+1,IF(ID=@id, @idnr := @nr,@idnr=@idnr),ID FROM tabela WHERE jakiespole ='jakiswarunek' ORDER BY jakiespole jakiessortoanieASClubDESC) podsel WHERE podsel.ID = @id;


Dzięki i pozdro.



Pojawił mi się jednak pewien problem z tym rozwiazaniem nospora. Jeżeli wyciągam dane z jednej tabeli uzyskuję oczekwiany wynik jeżeli natomiast zastosuję jakiegoś inner joina z drugą tabelą to już otrzymuję zero. Co ciekawe wystepuje to gdy mam klauzulę order by jeżeli natoamist ordera wywalę to wynik mam zwracany poprawnie. No ale bez ordera to mi akurat nie pasuje. Miałby ktoś pomysł w czym moze być problem ?
nospor
to pokaz to nowe zapytanie co masz
jajcarzd1
  1. SET @id=22,@nr=0,@idnr=0;
  2. SELECT @idnr AS nr FROM
  3. (SELECT @nr:=@nr+1,IF(c.idconfig=@id, @idnr := @nr,@idnr=@idnr),c.idconfig AS ab FROM config AS c INNER JOIN details AS d ON c.idconfig = d.idconfig WHERE c.name='homepage' ORDER BY c.sequence DESC)
  4. podsel WHERE podsel.ab = @id
nospor
a czy nie masz przypadkiem bledu zapytania? Sprawdzales to?
jajcarzd1
Cytat(nospor @ 28.05.2009, 10:06:21 ) *
a czy nie masz przypadkiem bledu zapytania? Sprawdzales to?


Sprawdzałem. Generalnie jak wywale sortowanie "order by c.sequence desc" to wynik już uzyskuje a jak pozostawię to ejst lipa i mam zero
nospor
sorki ze sie czepiam, ale jak sprawdzales czy nie ma bledu zapytania?
Bo jak bys mial blad zapytania, to wtedy faktycznie dostaniesz 0.
jajcarzd1
Cytat(nospor @ 28.05.2009, 10:14:51 ) *
sorki ze sie czepiam, ale jak sprawdzales czy nie ma bledu zapytania?
Bo jak bys mial blad zapytania, to wtedy faktycznie dostaniesz 0.


Hmm no chyba nie bardzo się rozumiemy. Jeżeli w podzapytaniu nie zastosuję ordera to wynik mam poprawny jeżeli go natomiast dołoże to wtedy mam zero więc zapytanie powinno być ok. Poza tym zerknąłem na wynik tego podzapytania pozostawiając tylko

  1. SET @id=22,@nr=0,@idnr=0;
  2.  
  3. (SELECT @nr:=@nr+1,IF(c.idconfig=@id, @idnr := @nr,@idnr=@idnr),c.idconfig AS ab FROM config AS c INNER JOIN details AS d ON c.idconfig = d.idconfig WHERE c.name='homepage' ORDER BY c.sequence DESC)


i z orderem w kolumnie "if(c.idconfig=@id, @idnr := @nr,@idnr=@idnr)" mam jedynki a przy odpowiendim id mam 0 natomiast bez ordera mam jego pozycję
nospor
mozesz zapodac screena z wynikow tego zapytania, o którym w ostatnim poscie wspomniales?
jajcarzd1
Pierwsze

  1. SET @id=22,@nr=0,@idnr=0;
  2. (SELECT @nr:=@nr+1,IF(c.idconfig=@id, @idnr := @nr,@idnr=@idnr),c.idconfig AS ab, c.sequence FROM config AS c INNER JOIN details AS d ON c.idconfig = d.idconfig WHERE c.name='homepage')


http://jajcarz.linuxpl.eu/images/bez_ordera.jpg

Drugie

  1. SET @id=22,@nr=0,@idnr=0;
  2. (SELECT @nr:=@nr+1,IF(c.idconfig=@id, @idnr := @nr,@idnr=@idnr),c.idconfig AS ab, c.sequence FROM config AS c INNER JOIN details AS d ON c.idconfig = d.idconfig WHERE c.name='homepage' ORDER BY c.sequence ASC)


http://jajcarz.linuxpl.eu/images/z_orderem.jpg
nospor
Kurcze, to jest nie logiczne.... albo mam zacme i nie widze jakiegoś banału :/
Przeslij jak mozesz mi na maile strukture i dane tych dwoch tabel. Jesli jest duzo rekordow to skróc do np. 50. Jak masz tajne dane to sie ich pozbadz. W wolnej chwili lukne na to na spokojnie u siebie

Wyslij na adres
[mojnick][malpa]gmail[kropka]com
jajcarzd1
Cytat(nospor @ 28.05.2009, 11:11:04 ) *
Kurcze, to jest nie logiczne.... albo mam zacme i nie widze jakiegoś banału :/
Przeslij jak mozesz mi na maile strukture i dane tych dwoch tabel. Jesli jest duzo rekordow to skróc do np. 50. Jak masz tajne dane to sie ich pozbadz. W wolnej chwili lukne na to na spokojnie u siebie

Wyslij na adres
[mojnick][malpa]gmail[kropka]com


Ok poszło
nospor
no i juz wiem gdzie jest blad. chodzi o @nr, do ktorego nie przypisuja sie wartosci gdy jest join i order
  1. SELECT @nr:=@nr+1,@nr
  2. FROM config AS c LEFT JOIN details AS d ON c.idconfig = d.idconfig WHERE c.name='oczamiinnych'
  3. ORDER BY c.sequence

Wyniki
1 0
2 0
3 0
4 0
5 0

  1. SELECT @nr:=@nr+1,@nr
  2. FROM config AS c LEFT JOIN details AS d ON c.idconfig = d.idconfig WHERE c.name='oczamiinnych'

Wyniki
1 1
2 2
3 3
4 4
5 5

teraz wywalamy join i nie zaleznie czy jest order czy nie to dziala
  1. SELECT @nr:=@nr+1,@nr
  2. FROM config AS c
  3. ORDER BY c.sequence

Wyniki
1 1
2 2
3 3
4 4
5 5


No i na chwile obecną nie rozumiem tego zachowania. Co ma left join w połączeniu z order, ze nie dziala przypisanie zmiennej @nr. Choc w pewnym sensie dziala, bo @nr:=@nr+1 rosnie prawidlowo
jajcarzd1
Cytat(nospor @ 28.05.2009, 11:55:28 ) *
No i na chwile obecną nie rozumiem tego zachowania. Co ma left join w połączeniu z order, ze nie dziala przypisanie zmiennej @nr. Choc w pewnym sensie dziala, bo @nr:=@nr+1 rosnie prawidlowo


No ja niestety też smile.gif
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.