Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zapytanie sql AVG()
valkirek
post
Post #1





Grupa: Zarejestrowani
Postów: 117
Pomógł: 6
Dołączył: 24.07.2013

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


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.

Ten post edytował valkirek 12.03.2014, 20:25:04
Go to the top of the page
+Quote Post
timon27
post
Post #2





Grupa: Zarejestrowani
Postów: 578
Pomógł: 69
Dołączył: 15.04.2007
Skąd: Wrocław

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


"LIMIT 0,10" oznacza "pokaż pierwsze 10 wyników"

Co oznacza 'chcę rozdzielić' ?

Ten post edytował timon27 12.03.2014, 20:36:26
Go to the top of the page
+Quote Post
Damonsson
post
Post #3





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


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ć.
Go to the top of the page
+Quote Post
valkirek
post
Post #4





Grupa: Zarejestrowani
Postów: 117
Pomógł: 6
Dołączył: 24.07.2013

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


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.
Go to the top of the page
+Quote Post
sazian
post
Post #5





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


to wyciągaj to podzapytaniem
Go to the top of the page
+Quote Post
valkirek
post
Post #6





Grupa: Zarejestrowani
Postów: 117
Pomógł: 6
Dołączył: 24.07.2013

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


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?

Ten post edytował valkirek 13.03.2014, 21:09:05
Go to the top of the page
+Quote Post
memory
post
Post #7





Grupa: Zarejestrowani
Postów: 616
Pomógł: 84
Dołączył: 29.11.2006
Skąd: bełchatów

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


  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
Go to the top of the page
+Quote Post
valkirek
post
Post #8





Grupa: Zarejestrowani
Postów: 117
Pomógł: 6
Dołączył: 24.07.2013

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


Wielkie dzięki kolego.
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: 28.08.2025 - 18:56