Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Relacja OneToMany, unikanie wielokrotnego powtarzania wyniku przy JOIN
...
post 8.08.2010, 22:51:05
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 1.10.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
zelu
post 8.08.2010, 23:00:32
Post #2





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
...
post 8.08.2010, 23:19:09
Post #3





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 1.10.2006

Ostrzeżenie: (0%)
-----


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.

Ten post edytował ... 8.08.2010, 23:19:47
Go to the top of the page
+Quote Post
prachwal
post 9.08.2010, 06:44:47
Post #4





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 13.03.2009
Skąd: lublin

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
wookieb
post 9.08.2010, 06:48:06
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 09:52