Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Głosowanie, zapytanie i sposób realizacji
Forum PHP.pl > Forum > Bazy danych > MySQL
ahold
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
kajzur
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
ahold
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
kitol
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
ahold
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
kitol
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)
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.