Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Głosowanie, zapytanie i sposób realizacji
ahold
post 27.05.2009, 21:01:07
Post #1





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 27.05.2009

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


Uszanowanie,

Mam uprzejme zapytanie, muszę wykonać system głosowania, i już teraz w trakcie tworzenia aplikacji muszę przemyśleć co będzie działo się "pod obciążeniem".

Załóżmy że baza danych miała by następującą konstrukcję

ID,id_glosowania,id_oddajacego,głos

Przykładowy wpis mógł by brzmieć:
1 1 666 1
2 1 777 0
3 1 555 0
4 1 888 0

Co za tym idzie, oddano trzy głosy (negatywne) i jeden pozytywny.
Tylko musimy założyć że takich głosów było by np 1500.

Teraz istnieje potrzeba utworzenia rankingu, kto był najlepszy a kto najgorszy.

Takim prostym sposobem jaki przychodzi mi do głowy to liczba pozytywnych głosów / negatywnych no i dostajemy wartość z dzielenia, którą porządkujemy w jakiś sposób, to już zależy od formy prezentacji czy rosnąco, czy nie rosnąco, wynik tak otrzymany mogli byśmy pokusić się o nazwanie mianem "wagi".


Problem jest taki, jak się za to zabrać...
Głupotą było by w php, w pętli "FOR" zliczać po kolei row[glos] i dzielić wynik, bo zabił bym apache, i i na dodatek administrator by mnie wyrzucił z takim kodem smile.gif.


Czy dało by się to zrobić w jednym zapytaniu do serwera SQL ? Tak abym w wyniku otrzymał gotową wartość ? waga=0,7.

Dwa, jak bardzo obciąża takie zapytanie serwer SQL ?
Jeżeli musi przeliczyć np te "wagę" z 1500 głosów ?


Proszę wybaczyć moje pytanie, ale nigdy osobiście nie miałem do czynienia z serwerem MySQL na środkowisku produkcyjnym z takim REQUESTEM.


Za wszelkie przykłady, itp, itd, będę niezmiernie wdzięczny winksmiley.jpg

Ten post edytował ahold 27.05.2009, 21:04:01
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
kajzur
post 27.05.2009, 21:11:11
Post #2





Grupa: Zarejestrowani
Postów: 385
Pomógł: 26
Dołączył: 22.03.2008
Skąd: TM

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


Hm, Tobie chodzi o wyłonienie z bazy danych ilości wpisów które mają głos=1 i glos=0 ? Jesli tak, to masz gotową funkcję mysql_num_rows.. Jeśli źle zrozumiałęm co chcesz osiągnąć, to sory smile.gif


--------------------
Zapraszam na mojego bloga. Dowiedz się jak uzyskać darmowy, zaufany certyfikat albo jak rozpoznawać głos ;)
Go to the top of the page
+Quote Post
ahold
post 27.05.2009, 21:16:01
Post #3





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 27.05.2009

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


Uszanowanie,

Potrzebuję kolego wyciągnąć stosunek głosów pozytywnych do negatywnych smile.gif

Pobrać ilość głosów pozytywnych
Pobrać ilość głosów negatywnych
Podzielić jedne przez drugie i wyświetlić wynik

Normalnie, musiał bym to zrobić na 3 zapytania.

1) SELECT where głosy = negatywne - liczbe do zmiennej z1
2) SELECT where głosy= pozytywne - liczbe do zmiennej z2
wynik = z1 / z2

Tylko, że tak wynik NIC MI NIE DAJĘ
bo nie mogę posortować według niego sad.gif

Marzy mi się, że wyświetlę TOP 5 głosowań.

Czyli:
SLECT xxx ORDER BY ( WAGA GŁOSU, która magicznie jakoś wyczarujemy, czyli podzielony stosunek negatywnych do pozytywnych) LIMIT 5

pozdrawiam
Go to the top of the page
+Quote Post
kitol
post 28.05.2009, 13:12:49
Post #4





Grupa: Zarejestrowani
Postów: 162
Pomógł: 26
Dołączył: 19.01.2007

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


Spróbuj:
  1. SELECT id, SUM(val=1)/(SUM(val=0)+SUM(val=1)) AS waga FROM tabela GROUP BY id;

gdzie
id to identyfikator głosowania,
val - wartość głosu =1 pozytywny =0 negatywny

w twoim przypadku
id to 2-ga kolumna,
val to 4-ta

Ten post edytował kitol 28.05.2009, 13:16:21
Go to the top of the page
+Quote Post
ahold
post 30.05.2009, 16:11:45
Post #5





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 27.05.2009

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


Witaj kolego,

Przepraszam że odpisuję dopiero teraz, ale miałem dużo zajęć.

Twój kod działa idealnie.

Sęk w tym, że nie przewidzieliśmy w tym algorytmie pewnej opcji.

1 głos na tak daje mi wagę 1.0000 :/
a 5 głosów na tak i jeden na nie daje 8.333

W związku z powyższym, ten 1 głos po mimo że ma najwyższą wagę, jest mniej obiektywny niż te 5 głosów.

Ma ktoś jakiś pomysł, na algorytm który podzielił by to jeszcze w jakiś sposób, tak aby było faktycznie bardziej "bezstronne" ?


pozdrawiam
Go to the top of the page
+Quote Post
kitol
post 31.05.2009, 17:14:33
Post #6





Grupa: Zarejestrowani
Postów: 162
Pomógł: 26
Dołączył: 19.01.2007

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


Witaj,

Spróbuj może poniższego wzoru:

waga = (oceny pozytywne / ilość wszystkich ocen ) * (1 - 0,5 / ilość wszystkich ocen)

czyli, każda obliczona waga jest mnożona przez współczynnik który zwiększa się od 0,5 dla 1 oceny do prawie 1 dla zwiększających się ilości ocen.W tym przypadku 1 pozytywna ocena zostanie "zaniżona" do 0,5 (czyli średniej ocen). Czym więcej ocen tym bardziej współczynnik przez który mnożymy zbliża się do 1 (czyli ma coraz mniejsze znaczenie)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 01:12