Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL/PHP] Pomoc w napisaniu funkcji zliczającej średnią.
Forum PHP.pl > Forum > Przedszkole
Shiro
Witam mam 3 tablele o zawartości:

CODE
--
-- Struktura tabeli dla `db_dane`
--

CREATE TABLE `db_dane` (
`id` smallint(6) NOT NULL auto_increment,
`user_id` smallint(6) NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM ;

-- --------------------------------------------------------

--
-- Struktura tabeli dla `db_ratings`
--

CREATE TABLE `db_ratings` (
`rating_id` smallint(5) unsigned NOT NULL auto_increment,
`rating_item_id` smallint(5) unsigned NOT NULL default '0',
`rating_type` char(1) NOT NULL default '',
`rating_user` smallint(5) unsigned NOT NULL default '0',
`rating_vote` tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (`rating_id`)
) TYPE=MyISAM ;

-- --------------------------------------------------------

--
-- Struktura tabeli dla `db_users`
--

CREATE TABLE `db_users` (
`user_id` smallint(5) unsigned NOT NULL auto_increment,
PRIMARY KEY (`user_id`)
) TYPE=MyISAM ;


Prosiłbym bardzo aby mi ktoś stworzył funkcję wyświetlającą średnią ocenę na podstawie zmiennej $user_id wziętej z user_id w db_users. Średnia wziętą ze wszystkich pól rating_vote (tzn. SELECT SUM(rating_vote) / COUNT(rating_item_id) ) gdzie rating_item_id zawiera id z db_dane w którym user_id to ta nasza zmienna podawana przy funkcji.

Od kilku godzin już się nad tym głowię i niestety brak postępów. Dopiero raczkuję w temacie mysql więc będę za wszelką pomoć wdzięczny
sniezny_wilk
Poczytaj trochę manuala na początek tutaj, robisz dwa zapytania i potem wykonujesz dzielenie normalnie w PHP, ale z tego co wiem da się to zrobić w jednym zapytaniu, więc można pobrać tylko rezultat zapytania. Jeśli masz phpMyAdmin poćwicz zapytania SQL na nim, zobacz czy wynik jest prawidłowy, zmień trochę przykład w manualu, do którego link dostałeś i to wszystko smile.gif
Shiro
A chociaż jakby ktoś szkielet tego wszystkigo podał bo z samym menualem sobie niestety nie dam rady... wstydnis.gif
Hazel
A zaglądałeś chociaż do manuala?
Jesli tak, to nie powinno Ci to sprawić żadnego problemu.
Kod
SELECT AVG(user_id) FROM db_dane;
Shiro
Coś mi się zdaje, że kompletnie nie zrozumiałeś co chcę otrzymać...

Ale i tak dzięki za zainteresowanie.
Hazel
Chyba faktycznie nie rozumiem, bo czytam Twojego posta ósmy raz i nie jarzę chyba. Wywnioskowałem tylko tyle, że raczej na pewno (?) masz więcej tabel niż ta jedna, której zrzut dałeś.

edit: aaaa, tam jest pasek przewijania sciana.gif
sorry tongue.gif
franki01
Kod
SELECT AVG(rat.rating_vote) FROM db_ratings rat, db_dane dane GROUP BY dane.user_id WHERE dane.user_id=$id_usera AND dane.user_id=rat.rating_item_id


Czy o takie cos chodzi?
Hazel
Kod
SELECT AVG(db_r.rating_vote) FROM  db_dane as db_d, db_ratings as db_r WHERE db_d.user_id=db_r.rating_item_id AND db_d.user_id='$id_usera'

Ale nie testowałem, przyznam otwarcie.

edit: no, mi też wyszło dokładnie to samo ale nie wiem czy to w porządku jest... trochę się trzeba spocić tongue.gif
Shiro
Hazel niestety zwraca Null...

franki01 wyskakuje błąd przy WHERE/END

Bardzo Wam obu dziękuję. Postaram się opisać po kolei co powinno robić zapytanie może to ułatwi...

1. Na początek mamy podaną "user_id" z db_users przyjmijmy, że jest to zmienna $user terez na jej podstawie:

2.Pobiera wszystkie "id" z db_dane w których user_id = $user

3. Pobiera średnią wszystkich "rating_vote" z db_ratings w których "rating_item_id" będzie równy wszystkim "id" pobranym w punkcie drugim.
franki01
Kod
SELECT AVG(rat.rating_vote) FROM db_ratings rat, db_dane dane GROUP BY dane.user_id WHERE dane.user_id='$id_usera' AND dane.user_id=rat.rating_item_id


Jak przy tym bedzie blad to napisz jaki dokladnie blad zwraca mysql i jak dokladnie wyglada zapytanie do bazy danych (echo $zapytanie). Bo moze cos w zapytaniu jest zle zrobione.
Shiro
CODE
SELECT AVG( rat.rating_vote )
FROM ep_ratings rat, ep_poezja poe
GROUP BY poezja.user_id
WHERE poezja.user_id = '187'
AND poezja.user_id = rat.rating_item_id
LIMIT 0 , 30

MySQL zwrócił komunikat: Dokumentacja
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE poe . user_id = '187' AND poe . user_id = rat . rating_item_id
LIMIT 0, ' at line 1


db_dane zastąpione ep_poezja struktura taka sama
db_ratings zastąpione ep_ratings
user_id przyjął wartość 187
bo mam ustawione że jeden rating_vote będzie miał wartość 3, a drugi 4 czyli średnia powinna dla tego użytkownika być 3,5


To test w PHPmyadmin
franki01
Zamiast:

Kod
LIMIT 0 , 30


Daj:

Kod
LIMIT 0,30


Czy kolo przecinka usun spacje. Powinno dzialac.

EDIT:
Jeszcze:

Kod
ep_poezja poe


zastap:

Kod
ep_poezja poezja
Shiro
Ten limit się tam automatycznie pojawia w kodzie bo ja żadnego limitu nie chcę.
Zapytanie jakie podaję:

SELECT AVG(rat.rating_vote) FROM ep_ratings rat, ep_poezja poezja GROUP BY poezja.user_id WHERE poezja.user_id = '187' AND poezja.user_id = rat.rating_item_id;

CODE
zapytanie SQL: Dokumentacja

SELECT AVG( rat.rating_vote )
FROM ep_ratings rat, ep_poezja poezja
GROUP BY poezja.user_id
WHERE poezja.user_id = '187'
AND poezja.user_id = rat.rating_item_id
LIMIT 0 , 30

MySQL zwrócił komunikat: Dokumentacja
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE poezja . user_id = '187' AND poezja . user_id = rat . rating_item_id
LIM' at line 1


W ogóle dla mnie bez sensu... Sprawdzałem na 100 sposobów....
franki01
Jaki ja jestem nieuwazny... Brak slow i wstyd smile.gif
Klauzula WHERE musi byc zawsze przed GROUP BY...

Kod
SELECT AVG( rat.rating_vote )
FROM ep_ratings rat, ep_poezja poezja
WHERE poezja.user_id = '$user_id'
GROUP BY poezja.user_id
AND poezja.user_id = rat.rating_item_id


Wielkie sory za problemy, ale czasami sa takie dni smile.gif
Shiro
To ja przepraszam za problemy, a dziękuję za pomoc.

Jeszcze jednak potrzeba chwilę nad tym kodem podłubać...

Na razie mam:
Kod
SELECT AVG(rat.rating_vote)
FROM ep_ratings rat ,
ep_poezja poezja
WHERE poezja.user_id = '187'
GROUP BY poezja.user_id
AND poezja.user_id = rat.rating_item_id

Ale nie otrzymuję wyniku 3,5 tylko 4.1366
3+4/2 = 3.5

Albo coś spartoliłem albo nie znam już kompletnie przyczyny.

Proszę jeszcze o umieszczenie w kodzie warunku
Kod
rating_type='W'
z ep_ratings bo nie wiem w którym to teraz miejscu dodać sciana.gif

Bardzo Was przepraszam za moje nieuctwo, wierzę jednak że może dzięki temu tematowi się czegoś nauczę i dziękuję za cierpliwość wstydnis.gif
franki01
Kod
SELECT AVG(DISTINCT rat.rating_vote)
FROM ep_ratings rat ,
ep_poezja poezja
WHERE poezja.user_id = '187'
AND rat.rating_type='W'
GROUP BY poezja.user_id
AND poezja.user_id = rat.rating_item_id
Shiro
Wszystko działa prawidłowo! Bardzo Dziękuję smile.gif guitar.gif
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.