broker
Član broj: 2415 Poruke: 8514 *.verat.net
|
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]
|