Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Zapytanie filtrujące i sortujące wyniki
Forum PHP.pl > Forum > Przedszkole
Diesel
Mamy tabelę:


Jak skonstruować zapytanie do bazy które:
Pobierze mi wszystkich autorów (author_id) dla wybranego użytkownika 1 (address_id = 1) a następnie posortuje rosnąco wyniki wg daty (time_out) tworząc z tego następująca tablice jednowymiarową:
$rezultat("1001", "1002");

PS: szukam najszybszej optymalnej drogi do skonstruowania $rezultat.


EDYCJA 00:41//
Stanąłem na zapytaniu:
  1. SELECT (author_id) FROM msg ORDER BY time_out

Jeszcze trzeba wykonać złączenie otrzymanych autorów
werdan
  1. SELECT (author_id) FROM msg AS m JOIN tabela_z_obrazka AS t ON m.author_id = t.author_id WHERE address_id = 1 GROUP BY time_out



Potem $result pakujesz do tablicy iterujac czym tam masz pod ręką .

np. foreach:

  1. $a = array();
  2. foreach($res as $r){
  3. $a[] = $r; //author_id
  4. }


w PDO chyba zwraca array. Nie wiem co i jak ci potrzeba. biggrin.gif
Diesel
zapytanie:
  1. SELECT (author_id) FROM msg AS m JOIN tabela_z_obrazka AS t ON m.author_id = t.author_id WHERE address_id = 1 GROUP BY time_out


zwraca błąd którego nie potrafię skorygować:
#1052 - Column 'author_id' in field list is ambiguous

PS: Czy mógłbyś opisać algorytm Twojego zapytania? nie znam jeszcze wszystkich komend a zależy mi na zrozumieniu co się dzieje krok po kroku:)
werdan
  1. SELECT (msg.author_id) FROM msg AS m JOIN tabela_z_obrazka AS t ON m.author_id = t.author_id WHERE address_id = 1 ORDER BY time_out


Tam jest ORDER nie GROUP.

> Czy mógłbyś opisać algorytm Twojego zapytania? nie znam jeszcze wszystkich komend a zależy mi na zrozumieniu co się dzieje krok po kroku:)

Postaram sie biggrin.gif
Pobierz rekordy i podaj mi ich author_id łączac z rekordami z bazy "tabela_z_obrazka" wtedy gdy mają ten sam author_id oraz gdy rekord ma address = 1, uporzadkuj według time_out.

Jakos tak biggrin.gif
Diesel
Po zamianie(czy nawet całkowitym usunięciu sortowania ORDER/GROUP) nadal zwraca błąd:
#1052 - Column 'author_id' in field list is ambiguous

..ale posiedze z rana nad materiałem który od Ciebie otrzymałem i może dojdę do rozwiązania. Dzięki rsc.gif

EDYCJA 2:20
.. no i skonstruowałem zapytanie które zwraca mi oczekiwany wynik:
  1. SELECT `author_id` FROM msg WHERE address_id ='1' GROUP BY `author_id` ORDER BY `time_out`

nerdsmiley.png nie taki diabeł straszny..
mmmmmmm
Cytat(Diesel @ 5.12.2013, 01:56:35 ) *
EDYCJA 2:20
.. no i skonstruowałem zapytanie które zwraca mi oczekiwany wynik:
  1. SELECT `author_id` FROM msg WHERE address_id ='1' GROUP BY `author_id` ORDER BY `time_out`

nerdsmiley.png nie taki diabeł straszny..

To zapytanie jest błędne. Że działa, to przypadłośc MySQL-a... Na np. ORACLE, czy postgreSQL nie przejdzie.
Prawidłowo powinno byc:
  1. SELECT `author_id` FROM msg WHERE address_id ='1' GROUP BY `author_id` ORDER BY Min(`time_out`)

Diesel
Napotkałem na problem przy rozbudowie zapytania. Do pogrupowanych autorów (author_id) w kolejnosci od ostatniej najnowszej wysłanej wiadomości do najstarszej(time_out) chciałbym przypisać dodatkowo:
1. datę najnowszej wiadomości danego autora
2. treść najnowszej wiadomości danego autora


Mamy zatem tabele msg:


Po wykonaniu zapytania:
  1. SELECT `author_id`,`time_out`,`msg_text` FROM msg WHERE address_id ='1' GROUP BY `author_id` ORDER BY `time_out` DESC


otrzymuje rezultat:


Zatem sortowanie odwrotne do moich założeń czyli:
1. datę najstarszej wiadomości danego autora
2. treść najstarszej wiadomości danego autora

Dla lepszego widoku wrzucę jeszcze rezultat zapytania bez grupowania wg autorów:

Na czerwono zanaczyłem wg których wierszy zapytanie scala a na zielono wg których powinno.

PYT1: Czy jest możliwość skonstruowania zapytania na poziomie sql bym otrzymał rezultat wg założeń?
PYT2: Może lepiej skonstruować osobne zapytanie do sql do pobierania potrzebnych danych?


OK, to nie było trudne wystarczyło pomyśleć i drobna zmiana naprawiła zapytanie:

  1. SELECT `author_id`,`time_out`,`msg_text` FROM msg WHERE address_id ='1' GROUP BY `author_id` DESC ORDER BY `time_out` DESC
mmmmmmm
  1. SELECT m.* FROM msg m JOIN (SELECT m.author_id, min(pod.time_out) sort, max(m.time_out) time_out FROM msg m JOIN (SELECT author_id, min(time_out) time_out FROM msg m WHERE address_id=1 GROUP BY 1) pod ON pod.author_id=m.author_id GROUP BY m.author_id) pod ON pod.time_out=m.time_out AND m.author_id=pod.author_id ORDER BY sort

Diesel
Cytat(mmmmmmm @ 5.12.2013, 12:35:00 ) *
  1. SELECT m.* FROM msg m JOIN (SELECT m.author_id, min(pod.time_out) sort, max(m.time_out) time_out FROM msg m JOIN (SELECT author_id, min(time_out) time_out FROM msg m WHERE address_id=1 GROUP BY 1) pod ON pod.author_id=m.author_id GROUP BY m.author_id) pod ON pod.time_out=m.time_out AND m.author_id=pod.author_id ORDER BY sort


Również działa rsc.gif
Rozumiem że zapytanie zaproponowane przez mmmmmmm jest wydajniejsze?
mmmmmmm
Jest poprawne. Na każdym DBMS-ie.
Diesel


Okazało się ze nie przewidziałem dość istotnej rzeczy, mianowicie gdy wyślemy nową wiadomość do użytkownika z którym nie korespondowaliśmy on zobaczy na swojej liście tę wiadomość my jednak już nie ponieważ zapytanie filtruje tylko dla address_id. Zanim przejdziemy do konstruowania zapytania (które chciałbym zrobić sam) ma do Was prośbę o pomoc w napisaniu algorytmu dla rezultatu który chce uzyskać.
mmmmmmm
1 IN (address_id, author_id)

1 IN (address_id, author_id) zamiast address_id=1
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.