Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Relacja jeden-do-wielu i pobieraie danych
Adam Nowak
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 15.08.2007

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


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. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Pozdrawiam

Ten post edytował Adam Nowak 28.08.2008, 14:02:58
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
JoShiMa
post
Post #2





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


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ę.
Go to the top of the page
+Quote Post
Adam Nowak
post
Post #3





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 15.08.2007

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


Rozwiązanie z podwójnym JOINem będzie chyba nieco mniej wydajne - czyż nie?
Go to the top of the page
+Quote Post
JoShiMa
post
Post #4





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Wydaje mi się, ze nie.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.12.2025 - 00:13