Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

MySQL: redni broj sloga u tabeli

[es] :: MySQL :: MySQL: redni broj sloga u tabeli

[ Pregleda: 3352 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

broker

Član broj: 2415
Poruke: 8514
*.verat.net



+11 Profil

icon MySQL: redni broj sloga u tabeli19.09.2003. u 17:15 - pre 250 meseci
Pravim top listu. Jedna od opcija je da za svaku stavku prikazem koja joj je prethodna pozicija bila na listi pa mi treba da zabelezim tekuci broj sloga. MySQL kao sto je i normalno takvu opciju nema.

Ima lineko kakav konstruktivan predlog.

Da razjasnim, ne terba mi da prikazem redni broj tekuceg sloga nego da ga zapamtim da znam koji je bio kada se promeni redosled slogova. Ova informacija nije kljucno polje tabele nego informacija.

Prihvatjivo je i neko resenje koje se oslanja na PHP.
 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.verat.net

Sajt: localhost


+5 Profil

icon Re: MySQL: redni broj sloga u tabeli19.09.2003. u 19:50 - pre 250 meseci
ovo recimo izvršavaj jednom dnevno (u ponoć) da zapamtiš poziciju od prethodnog dana koja će se prikazivati (kao prethodna) tokom celog sledećeg dana.

Code:

$cat=1;
$query="SELECT * FROM top_lista WHERE kategorija=$cat ORDER BY votes";
$list=sql_fetch_all_records($query);
$poz=0;
for ($list as $r) {
    $poz++;
    $id=$r['id'];
    sql_execute("UPDATE top_lista SET stara_pozicija=$poz WHERE id=$id");
}


 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: MySQL: redni broj sloga u tabeli19.09.2003. u 20:03 - pre 250 meseci
isto to malo drugačije. Sigurno je da imaš mesto u PHP kodu gde ubacuješ sam glas. Na tom mestu možeš da proveriš da li taj glas nije promenio mesto tog unosa u listi (tj da li kada sortiraš po broju glasova, taj unos i dalje ima mesto definisano u polju trenutno_mesto). Ako to nije tako (glas je promenio poziciju), onda zapišeš trenutno_mesto u staro_mesto, novu poziciju u polje trenutno_mesto ali i onaj unos koji je bio na poziciji novog mesta ažuriraš tako da u njegovo staro_mesto zapišeš njegovo trenutno_mesto, a u njegovo trenutno_mesto ono što je sada u listi, i tako rekurzivno, ili zbog optimizacije samo za prvih 10 (ostali imaju NULL u ova dva polja).
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

broker

Član broj: 2415
Poruke: 8514
*.verat.net



+11 Profil

icon Re: MySQL: redni broj sloga u tabeli19.09.2003. u 21:21 - pre 250 meseci
Momci hval ana trudu :)

Zombi tvoj predlog ne odgovara jer moram da radim azuriranej svaki put kad se izmeni nekipodatak koji moze da utice na redosled u top listi a ovo je malo zahtevno po pitanju resursa, bar mi tako izgleda.

Gorane, ovo sto si napisao stoji, mislim to je generalni princip. Problem je upravo u tome sto ne mogu da dobijem informaciju na kom je mestu podatak koji azuriram :)

Nego, sam malo tumbao po glavi pa sam smislio nesto sto moze da dovede do resenja. Verujem da je ovaj problem interesantan i drugimapa evo otprilike st amije palo na pamet:

Dakle, ako imam jednu tabelu IZBORI koja sadrzi podatke iz kojih se formira top lista. Nek kljuc te tabele bude ID_IZBORA, polje po kome se sortira lista POENI a polje gde cuvam prethodno mesto na listi POSL_POZICIJA. Treba mi da kada formiram top listu imam u slogu i informaciju na kom je mestu svaki izbor da bih mogao da je upotrebim za kasnije. Struktura je izmisljena i pojednotavljena. Prava stvar je mnogo komplikovanija pa da ne zbunjujem.

Napravicu pomocnu tabelu TMP_TOP_LISTA koja ce imati sledecu strukturu:

POZICIJA tinyint(3) unsigned AUTO_INCREMENT
ID_IZBORA tinyint(3) unsigned

U stvari evo kompletna struktura

#
# Table structure for table 'izbori'
#
DROP TABLE IF EXISTS izbori;
CREATE TABLE izbori (
id_izbora smallint(3) unsigned NOT NULL auto_increment,
opis varchar(30) default NULL,
poeni tinyint(3) unsigned default '0',
posl_pozicija tinyint(3) unsigned default '0',
PRIMARY KEY (id_izbora),
) ENGINE=MyISAM;

#
# Dumping data for table 'izbori'
#
INSERT INTO izbori VALUES("1", "A", "56");
INSERT INTO izbori VALUES("2", "B", "12");
INSERT INTO izbori VALUES("3", "C", "90");
INSERT INTO izbori VALUES("4", "D", "72");
INSERT INTO izbori VALUES("5", "E", "10");
INSERT INTO izbori VALUES("6", "F", "93");
INSERT INTO izbori VALUES("7", "G", "48");
INSERT INTO izbori VALUES("8", "H", "37");
INSERT INTO izbori VALUES("9", "I", "74");
INSERT INTO izbori VALUES("10", "J", "61");
INSERT INTO izbori VALUES("11", "K", "39");
INSERT INTO izbori VALUES("12", "L", "53");

#
# Table structure for table 'tmp_top_lista'
#
DROP TABLE IF EXISTS tmp_top_lista;
CREATE TABLE tmp_top_lista (
pozicija tinyint(3) unsigned NOT NULL auto_increment,
id_test tinyint(3) unsigned default NULL,
PRIMARY KEY (pozicija),
) ENGINE=MyISAM;




Postupak za dobijanje redosleda je sledeci (ako je tabela IZBORI vec popunjena potrebnim podacima):

DELETE FROM tmp_top_lista

ALTER TABLE tmp_top_lista AUTO_INCREMENT = 0

INSERT INTO tmp_top_lista
SELECT null AS pozicija, i.id_izbora FROM izbori i ORDER BY i.poeni DESC

Ovim mi autoincrement polje za svaki slog obezbedjuje informaciju o redosledu. E sad, sledeci korak bi trebao da bude da u tabeli IZBORI azuriram polje POSL_POZICIJA odgovarajucom vrednosti polja POZICIJA iz tabele TMP_TOP_LISTA. To bi trebalo da bude nesto kao

UPDATE izbori SET posl_pozicija = (SELECT t.pozicija FROM tmp_top_lista WHERE izbori.id_izbora = t.id_izbora)

Ali to zaavrsava sintaksnom greskom. Ne znam da li je neka banalnost ili MySQL ne podrzava SELECT u UPDATE. Videcu sutra za danas mi je dosta...

Ako ko sta smisli nek javi.



[Ovu poruku je menjao broker dana 19.09.2003. u 23:45 GMT]
 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.verat.net

Sajt: localhost


+5 Profil

icon Re: MySQL: redni broj sloga u tabeli19.09.2003. u 21:43 - pre 250 meseci
hm.. evo setio sam se najjednostavnijeg rešenja ;)

fazon je da ništa ne treba raditi pri dodavanju glasova već pri prikazivanju.

ovako, znači, glasanje ide normalno. ako povećavaš kolonu glasova samo uradiš UPDATE kada neko glasa. kao i do sada.

dodaj dve kolone, trenutno i prethodno za pozicije.

e, fazon je pri prikazu. ti ionako dobavljaš sve podatke kverijem sličnim SELET * FROM izbori ORDER BY poeni.

dok prolaziš kroz redove i prikazuješ ih, računaj im trenutnu poziciju ($poz++), i poredi to sa kolonom trenutno. ako se razlikuje, onda se redosled promenio, i samo treba da uradiš jedan UPDATE izbori SET prethodno=trenutno, trenutno=$poz.


// update: elem, sad vidim da je i goranov predlog sličan, samo ga ja nisam razumeo isprva, a čini se ni broker ;)

 
Odgovor na temu

broker

Član broj: 2415
Poruke: 8514
*.verat.net



+11 Profil

icon Re: MySQL: redni broj sloga u tabeli19.09.2003. u 21:51 - pre 250 meseci
Ne mogu to a radim prilikom prikazivanja jer se redosled mora azurirati nakon svake promene nekog podatka koji utice na redosled i vrlo je bitno da odmah po izmeni tog podatka sve bude azurno zbog drugih, prilicno komplikovanih zahteva u aplikaciji upravo oko azurnosti.
 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.verat.net

Sajt: localhost


+5 Profil

icon Re: MySQL: redni broj sloga u tabeli19.09.2003. u 21:58 - pre 250 meseci
pa dobro. onda ponovi ovaj isti postupak posle ažuriranja, samo nemoj da ispišeš ništa ;)


meni je samo tim redosledom to palo na pamet (da se pri ispisu to odradi), a ti implementiraj to kako već oćeš...
 
Odgovor na temu

[es] :: MySQL :: MySQL: redni broj sloga u tabeli

[ Pregleda: 3352 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.