Poštovanje svima..
Da li ima neko ko može da mi pomogne. Tražim jednu naredbu za prihvatanje podataka iz Mysql tabele.
Imam tabelu "neka_tabela" i u njoj kolone DATUM, BROJ, ZNAK. Datum predstavlja vreme kada je podatak unesen u tabelu. Znak u tabeli moze biti samo + i - (plus i minus), a brojevi su neki brojevi od 50 do 100. Podaci se u tabelu unose, jedan datum, jedan broj, jedan znak.
Meni treba naredba sa kojom cu prikazati BROJ koji ima vrednost od tri uzastopna unesena ista znaka, npr. minusa(-).
Recimo sledece podatke imam u tabeli:
12.10. 50 -
13.10. 52 +
14.10. 66 -
15.10. 50 -
16.10. 50 +
17.10. 66 -
18.10. 66 -
19.10. 50 -
Kao ste se vidi, broj 66 ima tri uzastopne minus(-) vrednosti. A 50 ima tri minus(-) vrednosti ali one nisu uzastopne.
Dakle, potrebna mi je naredba koja ce iz ove kolone izvuci jedino broj 66 kao rezultat.
Ovo teško ili skoro nikako ne može da se izvede u čistom SQLu a ponajmanje putem "neke" komande ;) Imaš dve opcije. Prva je da napišeš skladištenu proceduru (stored procedure) koja će odraditi ceo posao u okviru bloka SQL komandi a drugi je da iskoristiš neki od serverski orijentisanih programskih jezika kao recimo PHP.
Moja iskrena preporuka je da iskoristiš drugu varijantu jer bi u slučaju skladištenih procedura morao da imaš jako veliki broj ugnježdenih podupita što bi se pogubno odrazilo po performanse aplikacije. U PHPu bi recimo bilo potrebno da učitaš sadržaj kompletne baze u neki niz recimo (a ako je količina podataka velika mogu se recimo učitavati nizovi od 100-200 redova) i onda za svaki od učitanih redova proveriti da li sledeća dva ispunjavaju uslov. Relativno laka skripta za napraviti.
Hvala na odgovoru. Bilo mi je i sumnjivo da se ovako nesto moze izvesti u Mysql-u. Ali toliko fascinantnih primera sam video da sam pomislio: "što da ne".
Fokusiracu se na PHP. Hvala jos jednom!
Hvala na odgovoru. Bilo mi je i sumnjivo da se ovako nesto moze izvesti u Mysql-u. Ali toliko fascinantnih primera sam video da sam pomislio: "što da ne".
Fokusiracu se na PHP. Hvala jos jednom!Problem je u specifičnosti tvojih zahteva odnosno u tome što pokušavaš da za bukvalno svaki od zapisa u tabeli uradiš upoređivanja trenutno posmatranih podataka sa zapisima koji su u nekim drugim redovima. Tu ti ne ginu podupiti. SQL jeste jako moćan ali neke stvari se jednostavno ne isplate da se rade i mnogo ih je lakše uraditi nekim serverskim jezikom. Ne treba preterivati sa biznis logikom u okviru baza podataka ;)
Ako nekoga interesuje, evo ga rešenje:
mysql> create table t1 (datum int auto_increment primary key, broj int, znak char(1)) engine=myisam;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> insert into t1 (broj, znak) values
-> (12, '+'),
-> (57, '-'),
-> (48, '-'),
-> (72, '-'),
-> (25, '-'),
-> (59, '+'),
-> (52, '+'),
-> (25, '-'),
-> (54, '+'),
-> (25, '-'),
-> (5, '+'),
-> (6, '+'),
-> (5, '+'),
-> (7, '+'),
-> (5, '+'),
-> (43, '-'),
-> (23, '+'),
-> (23, '-'),
-> (12, '+'),
-> (56, '-'),
-> (96, '+'),
-> (44, '-'),
-> (43, '+');
Query OK, 23 rows affected (0.00 sec)
Records: 23 Duplicates: 0 Warnings: 0
mysql> select * from t1;
+-------+------+------+
| datum | broj | znak |
+-------+------+------+
| 1 | 12 | + |
| 2 | 57 | - |
| 3 | 48 | - |
| 4 | 72 | - |
| 5 | 25 | - |
| 6 | 59 | + |
| 7 | 52 | + |
| 8 | 25 | - |
| 9 | 54 | + |
| 10 | 25 | - |
| 11 | 5 | + |
| 12 | 6 | + |
| 13 | 5 | + |
| 14 | 7 | + |
| 15 | 5 | + |
| 16 | 43 | - |
| 17 | 23 | + |
| 18 | 23 | - |
| 19 | 12 | + |
| 20 | 56 | - |
| 21 | 96 | + |
| 22 | 44 | - |
| 23 | 43 | + |
+-------+------+------+
23 rows in set (0.00 sec)mysql> set @zzz=NULL; set @zz=NULL; set @z=NULL; set @nnn=NULL; set @nn=NULL; set @n=NULL;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> select * , @zzz:=@zz a, @zz:=@z b, @z:=znak c, @nnn:=@nn d, @nn:=@n e, @n:=broj f from t1 order by broj,datum,znak;
+-------+------+------+------+------+------+------+------+------+
| datum | broj | znak | a | b | c | d | e | f |
+-------+------+------+------+------+------+------+------+------+
| 11 | 5 | + | NULL | NULL | + | NULL | NULL | 5 |
| 13 | 5 | + | NULL | + | + | NULL | 5 | 5 |
| 15 | 5 | + | + | + | + | 5 | 5 | 5 |
| 12 | 6 | + | + | + | + | 5 | 5 | 6 |
| 14 | 7 | + | + | + | + | 5 | 6 | 7 |
| 1 | 12 | + | + | + | + | 6 | 7 | 12 |
| 19 | 12 | + | + | + | + | 7 | 12 | 12 |
| 17 | 23 | + | + | + | + | 12 | 12 | 23 |
| 18 | 23 | - | + | + | - | 12 | 23 | 23 |
| 5 | 25 | - | + | - | - | 23 | 23 | 25 |
| 8 | 25 | - | - | - | - | 23 | 25 | 25 |
| 10 | 25 | - | - | - | - | 25 | 25 | 25 |
| 16 | 43 | - | - | - | - | 25 | 25 | 43 |
| 23 | 43 | + | - | - | + | 25 | 43 | 43 |
| 22 | 44 | - | - | + | - | 43 | 43 | 44 |
| 3 | 48 | - | + | - | - | 43 | 44 | 48 |
| 7 | 52 | + | - | - | + | 44 | 48 | 52 |
| 9 | 54 | + | - | + | + | 48 | 52 | 54 |
| 20 | 56 | - | + | + | - | 52 | 54 | 56 |
| 2 | 57 | - | + | - | - | 54 | 56 | 57 |
| 6 | 59 | + | - | - | + | 56 | 57 | 59 |
| 4 | 72 | - | - | + | - | 57 | 59 | 72 |
| 21 | 96 | + | + | - | + | 59 | 72 | 96 |
+-------+------+------+------+------+------+------+------+------+
mysql> set @zzz=NULL; set @zz=NULL; set @z=NULL; set @nnn=NULL; set @nn=NULL; set @n=NULL;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> select datum, broj, znak from
-> ( select * , @zzz:=@zz a, @zz:=@z b, @z:=znak c, @nnn:=@nn d, @nn:=@n e, @n:=broj f from t1 order by broj, datum, znak) t
-> where
-> t.a=t.b and t.a=t.c -- tri zadnja znaka ista
-> and
-> t.d=t.e and t.d=t.f -- tri zadnja broja ista
-> ;
+-------+------+------+
| datum | broj | znak |
+-------+------+------+
| 15 | 5 | + |
| 10 | 25 | - |
+-------+------+------+
2 rows in set (0.00 sec)
Ala si ga zakomplikovao :) Iskreno da ti kažem pogubio sam se negde u pola u tvojoj logici ali nebitno. Ja i dalje ne bih koristio SQL za obradu podataka u ovom slučaju.
Usput...Izbegavaj SELECT * jer ga iskusni RDBMS designeri smatraju najvećim mogućim zlom kada su performanse upita u pitanju. Navedi tačne nazive kolona.
dusandevic
27.1.2010, 3:22
Usput...Izbegavaj SELECT * jer ga iskusni RDBMS designeri smatraju najvećim mogućim zlom kada su performanse upita u pitanju. Navedi tačne nazive kolona.
Da li to znači da ako u upitu želim da prikažem sve atribute tabele ipak treba da navodim imena atribura umesto *? Ili si mislio da ipak dobro razmislimo i selektujemo samo kolone koje će nam trebati?
vBulletin® v3.8.7, Copyright ©2000-2025, vBulletin Solutions, Inc.