Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Łączenie tablic przy pomocy klucza
Mephis
post 5.02.2016, 15:01:50
Post #1





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


Witam.

Mam sobie taki problem. Otóż potrzebuję rozwiązania, które pozwoli mi na wcielenie elementów jednej tablicy do drugiej.
Chodzi o zredukowanie ilości zapytań do bazy danych oraz pętel.

Postaram się przedstawić problem najprościej jak mogę - na przykładzie np. newsów i komentarzy do nich.

Pobieram z bazy wszystkie newsy i otrzymuję ich identyfikatory i rzecz jasna jakąś tam treść.
Następnie pobieram z bazy komentarze do newsów i otrzymuję ich identyfikator główny oraz identyfikator odnoszący się do newsa.

I teraz: wykonałem 2 zapytania do bazy posiadam 2 listy: jedną z newsami a drugą z komentarzami. Np.:
  1. [0] => Array (
  2. [news] => 1
  3. [tresc] => tesc1
  4. )
  5. [1] => Array (
  6. [news] => 2
  7. [tresc] => tesc2
  8. )
  9. )
  10.  
  11. [0] => Array (
  12. [komentarz] => 1
  13. [news] => 1
  14. [tresc] => komentarz pierwszy do newsa 1
  15. )
  16. [1] => Array (
  17. [komentarz] => 2
  18. [news] => 1
  19. [tresc] => komentarz drugi do newsa 1
  20. )
  21. [2] => Array (
  22. [komentarz] => 3
  23. [news] => 2
  24. [tresc] => komentarz pierwszy do newsa 2
  25. )
  26. )


A chciałbym połączyć to tak, aby wyglądało to w ten sposób:
  1. [0] => Array (
  2. [news] => 1
  3. [tresc] => tesc1
  4. [komentarze] => Array (
  5. [0] => Array (
  6. [komentarz] => 1
  7. [news] => 1
  8. [tresc] => komentarz pierwszy do newsa 1
  9. )
  10. [1] => Array (
  11. [komentarz] => 2
  12. [news] => 1
  13. [tresc] => komentarz drugi do newsa 1
  14. )
  15. )
  16. )
  17. [1] => Array (
  18. [news] => 2
  19. [tresc] => tesc2
  20. [komentarze] => Array (
  21. [2] => Array (
  22. [komentarz] => 3
  23. [news] => 2
  24. [tresc] => komentarz pierwszy do newsa 2
  25. )
  26. )
  27. )
  28. )
  29. )


Zaiste można pobrać newsy a potem w pętli pobierać do nich komentarze ale rozwiązanie to nie jest zbyt optymalne.

Można także w pętli odtworzyć tablicę z newsami i potem przeszukiwać za każdym razem tablicę z komentarzami, coś w tym rodzaju:
  1. $aktualnosci = $this->pobierz_aktualnosci();
  2. $komentarze= $this->pobierz_komentarze();
  3.  
  4. $newsy = [];
  5. foreach($aktualnosci as $aktualnosc) {
  6. foreach($komentarzeas $komentarz) {
  7. if($komentarz['news'] == $aktualnosc['news'])
  8. $aktualnosc['komentarze'][] = $komentarz;
  9. }
  10. $newsy[] = $news;
  11. }


Ale to rozwiązanie nie wydaje mi się też zbyt optymalne.

Wydaje mi się, że próbuję wynajdywać koło na nowo. Istnieje na to jakiś prosty sposób? Jakaś gotowa funkcja tablicy? Coś w rodzaju połączenia obu tablic przy pomocy klucza, który wiązałby obie tablice w jakiś sposób.
Najlepiej, jakby dało się to załatwić już na poziomie pobierania danych z bazy.

Ten post edytował Mephis 5.02.2016, 15:08:49
Go to the top of the page
+Quote Post
nospor
post 5.02.2016, 15:34:19
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Można także w pętli odtworzyć tablicę z newsami i potem przeszukiwać za każdym razem tablicę z komentarzami, coś w tym rodzaju:


Wkladajac news do tablicy nadajesz mu index bedacy jego ID.
Majac teraz tablice newsow i komenty, iterujesz po tablicy komenty, bierzesz ID newsa i wrzucasz koment do tablicy newsa - masz ID newsa wiec bez problemu mozesz dostac sie do newsa w tablicy przez index bedacy ID newsa.

Mozna to tez zrobic od razu przy pomocy jednego zapytania. Tu masz przyklad:
http://nospor.pl/grupowanie-wynikow.html

ps: czemu pobierasz wszystki newsy za jednym zamachem? Zdajesz sobie sprawe, ze jak bedziesz mial wiecej newsow to zajedziesz aplikacje?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Mephis
post 5.02.2016, 16:22:48
Post #3





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


Póki co potrzebowałem samego sposobu na wypełnienie "newsów" komentarzami. Ostatecznie pobierany byłby tylko pewien zakres elementów.

Sposób przedstawiony pod tym linkiem jest raczej dobry, gdyż ogranicza ilość zapytań do jednego, ale żeby poprawnie wyświetlić zakres "newsów", musiałbym w zapytaniu dodać warunek z podzapytaniem
  1. "...WHERE `id_newsa` IN (SELECT `id` FROM `newsy` LIMIT x)"

Czy takie rozwiązanie w tym przypadku jest dobre?

Ten post edytował Mephis 5.02.2016, 16:23:55
Go to the top of the page
+Quote Post
nospor
post 5.02.2016, 16:35:33
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




raczej tak


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Mephis
post 5.02.2016, 16:55:38
Post #5





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


Niestety, jest problem... Nie mogę użyć tego podzapytania w celu ograniczenia wyników.

"#1235 - This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'"

Ten post edytował Mephis 5.02.2016, 16:55:50
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: 24.06.2025 - 18:55