Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Łaczenie tabel
Forum PHP.pl > Forum > Przedszkole
maly_pirat
Cześć.

Sprawa wygląda następująco, połączyłem trzy tabele: użytkowników, newsów, komentarzy, wszystko gra ładnie,
tylko wyświetla "dziwienie"

- w tabeli "newsów" mamy 3 rekordy
- w tabeli "komentarzy" mamy 1 rekord

podczas wyświetlania przez pętle while wyświetla nam rezultat:

NEWSY:
[ News pierwszy ]
[ News drugi ]
[ News trzeci ]

KOMENTARZE:
[ Cześć Karol, co tam u Ciebie ? ]
[ Cześć Karol, co tam u Ciebie ? ]
[ Cześć Karol, co tam u Ciebie ? ]

Liczbę komentarzy mnoży przez liczbę newsów, dlaczego? Oto kod sql:
  1. <?php
  2. $sql = "SELECT a.username, a.user_lastvisit, a.user_regdate, a.user_gg, a.user_points,
  3.                n.news_id, n.news_title, n.author,
  4.                c.commentID, c.userID, c.comment
  5.                FROM ((". USER_TABLE ." a
  6.                LEFT JOIN ". NEWS_TABLE ." n ON a.user_id = n.author)
  7.                LEFT JOIN ". COMMENT_TABLE ." c ON a.user_id = c.userID)
  8.                WHERE user_id = '$user_id'
  9.                ORDER BY n.news_id DESC , c.commentID DESC";
  10. ?>
skowron-line
a po co te joiny w nawiasach questionmark.gif
maly_pirat
Znalazłem w sieci przykład, to na nim bazowałem - w nim były te nawiasy - jednak po usunięciu ich nie wiele pomogło, problem jest ten sam.
kefirek
  1. $sql = "SELECT * FROM ".NEWS_TABLE." n
  2. LEFT JOIN ".USER_TABLE." u ON (n.author=u.user_id)
  3. LEFT JOIN ".COMMENT_TABLE." c ON (u.user_id=c.userID)
  4. WHERE user_id = ".$user_id."
  5. ORDER BY news_id DESC, commentID DESC";
maly_pirat
Niestety nic nie pomogło, nadal dubluje wpisy, czyli problem leży głębiej w kodzie, no cóż jakoś sobie poradzę.
Pzdr.
erix
A GROUP BY?
maly_pirat
W ramach testu w czym błąd leży postanowiłem rozbić owe zapytania na dwa zapytania:

+ SQL: SELECT ... USER_TABLE + NEWS_TABLE;
+ SQL: SELECT ... COMMENT_TABLE

W jednym zapytaniu (pętla while) zastosowałem oto IF'a
  1. <?php
  2. if(empty($row['news_id'])) $news_link = 'Użytkownik nic nie pisze :-( NEWSÓW';
  3.            else $news_link = '<li><a href="news-'.$row['news_id'].'" title="'.$row['news_title'].'">'.$row['news_title'].'</a></li>';
  4. ?>


Oczywiście skrypt zwraca komunikat, jeśli użytkownik nie napisał żadnego newsa. Jako, że może zdarzyć się sytuacja, że użytkownik też nie napisze żadnego komentarza, w następnej pętli while wprowadziłem podobny kod:

  1. <?php
  2. if (empty( $row['parentID'] )) {        // brak komentarzy
  3.                $comm_link = 'Brak komentarzy';
  4.            }
  5.            else if ( $row['parentID'] == 1 ) { // news
  6.                $comm_link = '<li>link do komentarza</li>';
  7.            }
  8.            else if ( $row['parentID'] == 2 ) {    // artykuły
  9.                $comm_link = '<li>link do komentarza</li>';
  10.            }
  11. ?>


I teraz najlepsze z tego wszystkiego.. Użytkownik nie posiada żadnego komentarza, więc powinno wyświetlić 'Brak komentarzy' a tu nic nie wyświetla. Użytkownik ma komentarz, wyświetla mu normalnie LINK ($row['parentID'] == 1 bądź 2)


Co mogę dodać?
- Na końcu każdej pętli while dodaje unset($row)
- parentID int(11)
- news_id int(11)
- wstawiłem przed unset($row) (w drugiej pętli while) echo mysql_error(); - brak błędów.
pkwiatkowski
ja bym spróbował z GROUP BY:

  1. <?php
  2. $sql = "SELECT a.username, a.user_lastvisit, a.user_regdate, a.user_gg, a.user_points,
  3. n.news_id, n.news_title, n.author,
  4. c.commentID, c.userID, c.comment
  5. FROM ((". USER_TABLE ." a
  6. LEFT JOIN ". NEWS_TABLE ." n ON a.user_id = n.author)
  7. LEFT JOIN ". COMMENT_TABLE ." c ON a.user_id = c.userID)
  8. WHERE user_id = '$user_id'
  9. GROUP BY n.news_id
  10. ORDER BY n.news_id DESC , c.commentID DESC";
  11. ?>


można jeszcze dorzucić DISTINCT n.news_id
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.