Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie sql AVG()
Forum PHP.pl > Forum > Bazy danych > MySQL
valkirek
Witam. Mam pewien problem z zapytaniem:
  1. $checkPhoto=mysql_query("SELECT a.*,count(b.idPhotos) AS counterComm,c.sex,avg(d.rating) AS average
  2. FROM photos a
  3. LEFT JOIN comments b ON a.idPhoto=b.idPhotos
  4. LEFT JOIN profiles c ON a.idUserPhoto=c.idUser
  5. LEFT JOIN rating d ON a.idPhoto=d.idPhoto
  6. GROUP BY a.idPhoto
  7. ORDER BY a.timePhoto LIMIT 0,10");


I problem jest następujący. Jeżeli mam np. 10 ocen w tabeli rating to tak samo wyświetla mi 10 rekordów z tabeli comments. Myśle nad tym i myślę ale nie mam pomysłu jak te dwie tabele rozdzielić bo niby rozdzielone są:

  1. b ON a.idPhoto=b.idPhotos
  2. d ON a.idPhoto=d.idPhoto


Ale zastanawiam się czy tu nie jest problemem ta sama nazwa indexu w dwóch różnych tabelach?

Z góry dzięki za pomoc.
timon27
"LIMIT 0,10" oznacza "pokaż pierwsze 10 wyników"

Co oznacza 'chcę rozdzielić' ?
Damonsson
Jak chcesz rozdzielić, to rozdziel to na dwa zapytania. Dostajesz 10 wierszową równą tabelę zawsze. Nie da się dla różnych kolumn ustalić różnej ilości wierszy (najwyżej dostaniesz NULLa, ale zawsze ten wiersz będzie), chyba, że ja mam jakieś braki w wiedzy. Albo nie zrozumiałem o co chodzi, to jakiś przykład na sqlfiddle może rzuć.
valkirek
Timon27: LIMIT nie ma nic do rzeczy
Damonsson: Nie mogę rozdzielić tego na dwa zapytania bo wszystko leci w pętli a jak dam jedno zapytanie do pętli to będzie to niewydajne.

Chodzi mi o to aby przy zdjęciu wyświetlało ilość komentarzy z tabeli comments "count(b.idPhotos) AS counterComm)" i średnia ocena z tabeli rating "avg(d.rating) AS average"

Jeśli wyświetlam przy zdjęciach same komentarze z count() to nie ma problemu a jeżeli dodam avg() i left join z tabela rating to wyświetla mi ilość komentarzy taką, jaka jest ilość głosów w tabeli rating.
sazian
to wyciągaj to podzapytaniem
valkirek
Dzięki Sazian ale kombinuje i nie bardzo mi to wychodzi a z podzapytaniami to nie bardzo miałem doświadczenia. Teraz ciągle mam błąd o braku aliasu average albo mam brak rekordów całkowicie.

Może ktoś podać przykład jak takie zapytanie ma wyglądać?

P.S. Czemu moje rozwiązanie nie może wyświetlić poprawnych wyników?

Więc ktoś pomoże czy nie?
memory
  1. SELECT a.*,(SELECT count(b.idPhotos) FROM comments b WHERE b.idPhoto = a.idPhotos) AS counterComm,c.sex,(SELECT avg(d.rating) FROM rating d WHERE d.idPhoto=a.idPhoto) AS average
  2. FROM photos a
  3. LEFT JOIN profiles c ON a.idUserPhoto=c.idUser
  4. ORDER BY a.timePhoto LIMIT 0,10


Z palca
valkirek
Wielkie dzięki kolego.
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.