PDA

Prikaži potpunu verziju : Mysql i delete max values...


dziber
22.10.2006, 17:42
Jel postoji komanda koja bi trazila najvecu vrednost polja i brisala sve ispod te vrednosti?

holodoc
22.10.2006, 21:25
Pa ne postoji SQL komanda koja bi automatski radila to što tebi treba već se to radi odgovarajućom konstrukcijom uslovnog „WHERE“ dela SQL komande „DELETE“.

Evo primera kako bi trebala da izgleda SQL upit koji bi trebalo da reši tvoj problem.
DELETE FROM naziv_tabele
WHERE posmatrana_kolona < (SELECT MAX(posmatrana_kolona) FROM naziv_tabele)
LIMIT 1
Iskreno rečeno neznam zbog čega bi koristio ovakvu logiku rada sa bazom pošto mi se čini da pokušavaš da skladištiš rezultat obrade podatka u nju a ne same podatke što je jedna od velikih grešaka u dizajnu aplikacije tj. same baze.

Ako ti je potrebno da u svojoj aplikaciji koristiš samo zapise koje u odgovarajućem redu sadrže samo maksimalnu vrednost bolje rešenje ti je da koristiš samo jedan SELECT upit kao što je sledeći:
SELECT kolone_koje_te_interesuju_razdvojene_zarezima
FROM posmatrana_tabela
WHERE posmatrana_kolona = (SELECT MAX(posmatrana_kolona)
FROM naziv_tabele)
LIMIT 1
Na ovaj način ćeš umesto veoma zahtevne „DELETE“ komande (koja zauzima poprilično resursa na SQL serveru u odnosu na ostale komande) i nepotrebnih upita dobiti recordset koji će da sadrži samo zapise sa maksimalnom vrednošću u posmatranoj koloni.

BTW, vodi računa o tome da oba upita mogu da imaju više rezultata pa moraš ili da dodaš neki dodatni uslov u „WHERE“ ili da koristiš „LIMIT“ onako kako misliš da ti najviše odgovara inače ćeš imati problem sa integritetom baze ;)

dziber
23.10.2006, 18:52
U redu ali kako da onda obrisem to sto izvrsi select komanda.

Nije mi najjasnije zato sto bi ja trebo da iz tabele izbrisem podatke.
Nesto sam cacko po netu i naso neke komande sa delete naredbom ali mi
ubije racunar izvrsavanje tenaredbe.

Da li bi mogao nekako sa tvojim primerom select naredbe koju si mi naveo
da precistim iz tabele te podatke koji mi ne trebaju?

I jel postoji nesto sto bi ubrzalo proces brisanja

hvala mnogo

Marko_L
23.10.2006, 20:02
Ako ćeš da brišeš onda koristiš onaj prvi upit koji si dobio, a ako samo hoćeš da prikažeš potrebne podatke koristiš ovaj drugi. Nema treće :)

dziber
23.10.2006, 20:14
Ok.
Medjutim kad pokusam prvu nardbu izbacuje mi gresku kao ne mogu
ja da koristim from.
Ne znam sta znaci to ali da to nema veze sa podupitima.
Verzija mysql -a je 4.1
Da li je to kod mene podrzano.

I moze samo jos jedno pitanjce
da li mogu vise naredbi da spakujem u jedan batch file ili samo jednu.
A ako ima nacin koji je. hvala

Marko_L
23.10.2006, 20:52
Probaj
DELETE * FROM naziv_tabele
WHERE posmatrana_kolona < (SELECT MAX(posmatrana_kolona) FROM naziv_tabele)
LIMIT 1

dziber
23.10.2006, 20:59
uradio sam to i opet mi izbaci sledecu poruku:

ERROR 1093 at line 1: you can't specify target 'mojatabela' for update in FROM clause

isto ovo mi izbaci i za onu ranije komandu gde se mesto < koristilo =

holodoc
23.10.2006, 23:16
Ukoliko u toku rada sa MySQL-om naletiš na neki problem najbolje ti je da konsultuješ MySQL online dokumentaciju gde ćeš sigurno naći rešenje za svoj problem.

Što se tiče tvog konkretnog problema baci pogle ovde:

http://bugs.mysql.com/bug.php?id=6980

Na osnovu informacija na ovoj stranici (u slučaju da ti lično nisi napravio neku grešku u radu) najverovatnije imaš problema sa verzijom koju koristiš pa ne bi bilo loše da pokušaš sa nekom novijom verzijom. Ako budeš imao problema sa određenim kombinacijama Appache-a, MySQL-a i PHP-a (pretpostavljam da ti ovo treba za neki sajt) onda je najbolje da instaliraš XAMPP paket i da te ne boli glava.

Što se tiče drugog pitanja, sve komande možeš bez problema da pokreneš iz nekog tekstualnog fajla koji sadrži SQL naredbe. Pokretanje možeš da vršiš na dva načina i to u slučaju da si već logovan na mysql server i u slučaju da nisi. U prvom slučaju dovoljno je da ukucaš sledeći red:
source putanja_i_naziv_fajla_koji_sadrzi_komande
Upamti da ovo možeš da radiš samo ako si ulogovan tj. imaš odzivni znak servera ("mysql>").

U drugom, relativno upotrebljivijem slučaju moraš da kucaš sledeći oblik komande:
mysql < source putanja_i_naziv_fajla_koji_sadrzi_komande -u[korisnicko_ime] -p[lozinka]
Primera radi ako ti se komande nalaze u fajlu "komande.sql", korisničko ime ti he "root" i lozinka "stargazer" linija koju treba da izvršiš je:
mysql < komande.sql -uroot -pstargazer
Korisničko ime i lozinku sam stavio da ne bi bilo potrebe da u zasebnoj liniji kucaš lozinku ako ovu komandnu liniju pozivaš iz neke aplikacije.