Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Łączenie tablic przy pomocy klucza
Forum PHP.pl > Forum > PHP
Mephis
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.
nospor
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?
Mephis
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?
nospor
raczej tak
Mephis
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'"
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.