Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Relacja jeden-do-wielu i pobieraie danych
Forum PHP.pl > Forum > Bazy danych > MySQL
Adam Nowak
Witam,
zacznę od danych:

Posiadam trzy tabele (w poniższym przykładzie table i ich struktura są fikcyjne, ale dobrze obrazują o co mi chodzi)
news
ID - identyfikator
contents - treść aktualności

photos
photoID - identyfikator
newsID - ID newsa, do którego odnosi się zdjęcie
path - ścieżka do obrazu

comments
commentID - identyfikator
newsID - ID newsa, do którego odnosi się komentarz
author - autor komentarza
contents - treść komentarza

Jeden news może posiadać dowolną ilość zarówno zdjęć jak i komentarzy, czyli mamy podwójną relację jeden-do-wielu.

Teraz chciałbym otrzymać taki wynik zapytania:
Kod
Array
(
    [0] => Array
        (
            [ID] => 1
            [contents] => ...
            [photos] => Array
                (
                    [0] => ...
                    [1] => ...
                )

            [comments] => Array
                (
                    [0] => Array
                        (
                            [author] => ...
                            [contents] => ...
                        )

                    [1] => Array
                        (
                            [author] => ...
                            [contents] => ...
                        )

                    [2] => Array
                        (
                            [author] => ...
                            [contents] => ...
                        )

                )

        )

    [1] => Array
        (
            [ID] => 2
            [contents] => ...
            [photos] => Array
                (
                    [0] => ...
                    [1] => ...
                )

            [comments] => Array
                (
                    [0] => Array
                        (
                            [author] => ...
                            [contents] => ...
                        )

                    [1] => Array
                        (
                            [author] => ...
                            [contents] => ...
                        )

                    [2] => Array
                        (
                            [author] => ...
                            [contents] => ...
                        )

                )

        )

    [2] => Array
        (
            [ID] => 4
            [contents] => ...
            [photos] => Array
                (
                    [0] => ...
                    [1] => ...
                )

            [comments] => Array
                (
                    [0] => Array
                        (
                            [author] => ...
                            [contents] => ...
                        )

                    [1] => Array
                        (
                            [author] => ...
                            [contents] => ...
                        )

                    [2] => Array
                        (
                            [author] => ...
                            [contents] => ...
                        )

                )

        )

)

Ewentualnie zdjęcia również mogą być jako tablice (z jednym indeksem).

Powyższą tablicę mógłbym otrzymać wykonując trzy zapytania i tworząc w pętli ostateczną formę:
  1. <?php
  2.  
  3. $news = $db->getRows('SELECT * FROM news;');
  4. $photos = $db->getRows('SELECT * FROM photos;');
  5. $comments = $db->getRows('SELECT * FROM comments;');
  6.  
  7. $result = array();
  8.  
  9. foreach($news as $n){
  10. $result[] = array(
  11. 'ID' => $n['ID'],
  12. 'contents' => $n['contents'],
  13. 'photos' => array(),
  14. 'comments' => array()
  15. );
  16. }
  17.  
  18. foreach($photos as $p){
  19. $result[$p['newsID']]['photos'][] = $p['path'];
  20. }
  21.  
  22. foreach($comments as $c){
  23. $result[$c['newsID']]['comments'][] = array(
  24. 'author' => $c['author'],
  25. 'contents' => $c['contents']
  26. );
  27. }
  28. ?>

Ale zastanawiam się (właściwie z czystej ciekawości) czy istnieje możliwość wykonania tego inaczej (czyt.: wydajniej).
Chociaż te dane ($result) i tak będą cacheowane. winksmiley.jpg

Pozdrawiam
JoShiMa
Możesz w jednym zapytaniu uzyć dwukrotnie JOIN, ale tablicę i tak będziesz musiał zrobić w pętli. Zysk jest taki, że masz jedno zapytanie i jedną pętlę.
Adam Nowak
Rozwiązanie z podwójnym JOINem będzie chyba nieco mniej wydajne - czyż nie?
JoShiMa
Wydaje mi się, ze nie.
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.