Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Relacje między tabelami
Forum PHP.pl > Forum > Przedszkole
The Night Shadow
Mam dwie tabele:

logowanie (gdzie najważniejszą jest kolumna 'login' - jest to tabela z listą użytkowników strony)
komentarze (gdzie najważniejsza kolumna to imie, które równe jest jednem z loginów w tabeli logowanie).

Stworzyłem podstronę, na której wyświetlana jest lista wszystkich użytkowników wraz z ich skróconymi statystykami, między innymi ilość kometarzy jakie dany użytkowników dodał.

Problem polega na tym, że nie bardzo potrafię stwarzać zapytania z życiem relacji między tabelami. Napisałem wiec zapytanie pobierające listę żytkowników, którzy w pętli są wyświetlani w odpowiedni sposób, ale dla kazdego użytkownika pojawiają się dodatkowe zapytania, w tym o liczbe komentarzy. Wszystko byłoby w porzadku, ale kiedy użytkowników jest 40 zamiast jednego zapytania pojawia się ich 40 (dodając do tego listę ostatnich logowań, adresów ip i liczę wpisów do księgi gości daje to kolosalną ich liczbę).

I tu pytanie do Was. W jaki sposób stworzyć relację między tymi tabelami tak, by lista użytkowników była wyświetlana bez potrzeby każdorazowo wykonywania dodatkowych zapytań o liczbę komentarzy.
dr_bonzo
Podaj struktury tabel: "show create"
Kuziu
  1. SELECT u.login, count(c.id) AS ilosc
  2. FROM users
  3. u LEFT JOIN comments c ON(u.login = c.imie) GROUP BY (c.imie);


Lepiej jednak jak bys zapisywal ID uzytkownika w komentarzach dzieki temu zawsze mozesz zmienic jego nicka i automatycznie zmini się on we wszystkich komentarzach.
wijet
Po pierwsze nie powinieneś w tabeli komentarze trzymać loginu użytkownika tylko jego identyfikator.
Masz tabele uzytkownicy - users
o polach
id login pass

i tabele komentarze - comments
o polach
id_kom id_usera komentarz

  1. SELECT comments.id,comments.komentarz,users.login
  2. FROM comments,users
  3. WHERE comments.id_user = users.id;

a tak wogóle

Manual join tongue.gif
The Night Shadow
Dzieki. :- ) Ja manual czytałem, ale nadal mam problemy z zastosowaniem tego w praktyce.

  1. <? $zapytanie = mysql_query("SELECT * FROM logowanie LEFT JOIN komentarze ON komentarze.id_uzytkownika=l
    ogowanie.id"
    );
  2. }
  3.  
  4. // WYŚWIETLANIE LISTY UŻYTKOWIKÓW
  5.  
  6. while($wiersz=mysql_fetch_array ($zapytanie)) 
  7. { ?>



<? echo "".$wiersz['login'].""; ?> To wyświtla już nazwę użytkownika, zmieniłem nieco zapytanie, ale. W jaki sposób obliczyć teraz ilość komentarzy?

Strktura tabel wygląda tak

logowanie
id login itd... (reszta mniej istotna)

komentarze
id id_uzytkownika tresc itd...
wijet
A no tak przyznaje się troche przeoczyłem.
Chodzi o statystyki o użytkowniku

Naprzyklad zapytanie wyświetlające nazwy użytkowników i liczbe komentarzy.
O coś takiego Ci chodzi

  1. SELECT users.login,count(komentarze.id) AS ilosc_kom
  2. FROM users,kometrze
  3. WHERE users.id = komentarze.user_id
  4. GROUP BY ilosc_kom
The Night Shadow
  1. <?php
  2. $zapytanie = mysql_query("SELECT logowanie.login,count(komentarze.id) as ilosc_kom FROM logowanie,komentarze WHERE logowanie.id=komentarze.id_uz
    ytkownika GROUP BY ilosc_kom"
    );
  3. ?>


Cytat
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/ogien/public_html/plikuzytkownicy.php on line 642


Co robić?
nospor
pokaz pare linijek przed i pare po. blad nie dotyczy bezposrednią tej linii
The Night Shadow
Rzeczywiście... tamten problem już wyeliminowałem, ale pojawił się kolejny

  1. <?php
  2. {
  3.  
  4.                             $zapytanie = mysql_query("SELECT logowanie.login,count(komentarze.id) as ilosc_kom FROM logowanie,komentarze WHERE logowanie.id=komentarze.id_uz
    ytkownika GROUP BY ilosc_kom"
    );
  5.                             }
  6.                             
  7.                             
  8.                             
  9.                             
  10.                             
  11.                             
  12.                             // WYŚWIETLANIE LISTY UŻYTKOWIKÓW
  13.                             
  14.                             while($wiersz=mysql_fetch_array ($zapytanie)) 
  15.                             { ?>



Cytat
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/ogien/public_html/plikuzytkownicy.php on line 575


A zależy mi na wyświetlaniu użytkowników w pętli...
nospor
masz bledne zapytanie. nie mozesz grupowac po czyms co dopiero wyliczasz. propnuje ci zajrzec do manuala i poczytac se o group by
The Night Shadow
Przeprasam, ale to nie ja proponowalem taką strukturę zpaytania tylko Wijet, a że jestem w Przedszkolu ufam temu co poadją inni.
nospor
a to przepraszam winksmiley.jpg
Masz wiec pierwszą darmową lekcję: trust no one winksmiley.jpg

  1. SELECT users.login,count(komentarze.user_id) AS ilosc_kom
  2. FROM users,komentarze
  3. WHERE users.id = komentarze.user_id
  4. GROUP BY users.id

Tak wogole powinno to byc na left joinie, bo chyba nie kazy user musi miec komenatarze?
The Night Shadow
No w istocie nie każdy.. czyli jak? Przpominam, ze zależy mi na ilości komentarzy.
nospor
oj, przedszkole , przedszkolem, ale manual nie gryzie winksmiley.jpg

  1. SELECT users.login,count(komentarze.user_id) AS ilosc_kom
  2. FROM users
  3. LEFT JOIN komentarze ON users.id = komentarze.user_id
  4. GROUP BY users.id
The Night Shadow
LEFT JOIN komentarze
A jeśli chcę wybrać z komentarze również konkretne dane?
nospor
konkretne dane czego? komentarza? nie wyciągniesz, gdyz zliczasz komentarze.
a jesli konkretne dane z tabeli user, to se pobieraj. teraz przeciez pobierasz login.

ps: i czytaj PW jakie dostajesz od kogos. w tym przypadku odemnie
The Night Shadow
Moje zapytanie wygląda w tym momencie następująco:

  1. <?php
  2. $zapytanie = mysql_query("SELECT logowanie.login,count(komentarze.komentarz_id_uzytkownika) as ilosc_kom,count(ksiega.szept_id_uzytkownika) as ilosc_sze,logowanie.status,logowanie.data,logowanie.email,logowanie.gad
    u,logowanie.tlen,logowanie.imie,logowanie.ranga FROM logowanie LEFT JOIN komentar
    ze ON logowanie.id=komentarze.komentarz_id_uzytkownika LEFT JOIN ksiega ON logowa
    nie.id=ksiega.szept_id_uzytkownika GROUP BY logowanie.id"
    );
  3. ?>


Dołączone sa więc dwie tabele kometarze i ksiega. Obie po to, by zliczać ilość wpisów pod artykułami (notkami) i w ksiedze gości dla danego użytkownika. Pytanie jest jedno. Co zrobić, by do tego wszystkiego dołączyć tabelę daty_logowań i później móc wyświetlić 5 ostatnich dla danego użytkownika...?
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.