Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Relacja OneToMany, unikanie wielokrotnego powtarzania wyniku przy JOIN
Forum PHP.pl > Forum > Bazy danych > MySQL
...
Witam.
Prawdę mówiąc nie jestem specjalnie zaznajomiony ze składnią SQL, a postanowiłem zabrać się za optymalizację.

Mam dwie tabele posts i comments. Chciałbym w jednym zapytaniu pobrać dane od tabeli posts gdzie id=1 oraz wszystkie komentarze dla tego postu.
Użyłem zapytania:
  1. SELECT *
  2. FROM `posts`
  3. LEFT OUTER JOIN `comments` ON comments.posts_id = posts.id
  4. WHERE posts.id =1

Wiem, że skoro optymalizuję to powinienem zamienić * na całą strukturę, ale dałem tak dla uproszczenia.

Co chcę uzyskać?
  1. post => array('title' => 'sth', 'body' => 'sth),
  2. comments => array(array(), array(), array() )
  3. )

Gdzie w każdej tablicy w 'commets' są wyniki komentarza jak autor i treść.

Pewnie przesadzam i wygodniej po prostu będzie skorzystać w 2 zapytań, no ale nie zaszkodzi zapytać winksmiley.jpg
Pozdrawiam
zelu
Cytat
Pewnie przesadzam i wygodniej po prostu będzie skorzystać w 2 zapytań, no ale nie zaszkodzi zapytać


Tak, czasami warto użyć dwóch zapytań, niż męczyć się ze skomplikowanym zapytaniem i pobieraniem dużej ilości nadmiarowych danych, żeby tylko nie używać dwóch. Przypuśćmy, że chcesz pobrać temat, treść, date utworzenia i autora postu z tabeli posts, oraz komentarz, nazwę autora oraz datę z tabeli comments.

Jak widzisz, żeby pobrać zestaw komentarzy pobierasz dużo nadmiarowych danych z tabeli posts. Co więcej, w powyższym przykładzie pobieraz więcej danych z tabeli posts niż z samej tabeli komentarzy smile.gif A co w przypadku, kiedy np będzie 100 komentarzy do wyświetlenia? Mija się to po prostu z celem.
W przypadku dwóch zapytań natomiast pobierasz jeden wiersz z danymi postu, a z tabeli komentarzy pobierasz to, co faktycznie potrzebne jest do ich wyświetlenia (bez bałaganu z posts)

Wiem, że często się mówi, żeby ograniczać ilość zapytań do minimum, ale z drugiej strony nie popadajmy w skrajności. Inaczej wygenerowanie całej strony będziemy pisać w jednym zapytaniu smile.gif


Pozdro
...
Dziękuję za odpowiedź winksmiley.jpg
A korzystając z okazji, mógłby ktoś mi polecić jakieś naprawdę dobre źródło nauki składni MySQL? Chodzi mi o zapytania bardziej złożone (chociaż przyznam, że dla mnie zastosowanie JOIN jest już złożone, gdyż wcześniej tego nie robiłem, ew. bawiłem się w ORM). Obojętnie czy strona internetowa, czy książka.
prachwal
warto się nauczyć SQL-a
w tym konkretnym przypadku to trochę bez znaczenia, ale jak byś miał np. policzyć ile komentarzy ma każdy post w podziale na miesiące w zestawieniu rocznym -> jedno zapytanie SQL na marginesie, to warto się przesiąść z PHP do konstrukcji SQL-owych
wookieb
Cytat(... @ 9.08.2010, 00:19:09 ) *
Dziękuję za odpowiedź winksmiley.jpg
A korzystając z okazji, mógłby ktoś mi polecić jakieś naprawdę dobre źródło nauki składni MySQL? Chodzi mi o zapytania bardziej złożone (chociaż przyznam, że dla mnie zastosowanie JOIN jest już złożone, gdyż wcześniej tego nie robiłem, ew. bawiłem się w ORM). Obojętnie czy strona internetowa, czy książka.

Manual MYSQL
oraz fajna rzecz
http://www.codinghorror.com/blog/2007/10/a...-sql-joins.html
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.