PDA

Prikaži potpunu verziju : SQL naredba za prikazivanje podataka


srdjan82
3.8.2009, 18:45
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.

holodoc
3.8.2009, 20:20
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.

srdjan82
3.8.2009, 20:25
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!

holodoc
3.8.2009, 20:35
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 ;)

srdjan82
4.8.2009, 15:08
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)

holodoc
4.8.2009, 22:34
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?