[ SrdjanS. @ 03.08.2009. 16:27 ] @
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.

[Ovu poruku je menjao SrdjanS. dana 03.08.2009. u 18:17 GMT+1]
[ bogdan.kecman @ 03.08.2009. 20:05 ] @
ovo neko kockanje?

kako god okrenes moraces "ORDER BY datum" ... e sad .. sta ako imas njih 10 sa istim datumom kada su uneseni? u tom slucaju mozes da razmislis o "ORDER BY datum, znak" ili da ostavis samo "ORDER BY datum" ... ne racunaj da ce ti mysql vratiti rezultate po redu kojim su ubacivani tako da je to prva stvar koji treba da odlucis ...

dalje ..

Code:

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 (rand()*100, '-'),  (rand()*100, '-'), (rand()*100, '+'), (rand()*100, '-'), (rand()*100, '-'), (rand()*100, '+'), (rand()*100, '+'), (rand()*100, '-'), (rand()*100, '-'), (rand()*100, '-'), (rand()*100, '+'), (rand()*100, '+'), (rand()*100, '+'), (rand()*100, '-'), (rand()*100, '+'), (rand()*100, '-'), (rand()*100, '-'), (rand()*100, '-'), (rand()*100, '+'), (rand()*100, '-'), (rand()*100, '+'), (rand()*100, '-'), (rand()*100, '-'), (rand()*100, '-'), (rand()*100, '+'), (rand()*100, '+'), (rand()*100, '-');

Query OK, 27 rows affected (0.00 sec)
Records: 27  Duplicates: 0  Warnings: 0


mysql> select * from t1;
+-------+------+------+
| datum | broj | znak |
+-------+------+------+
|     1 |   71 | -    | 
|     2 |   59 | -    | 
|     3 |   81 | +    | 
|     4 |   28 | -    | 
|     5 |   97 | -    | 
|     6 |    0 | +    | 
|     7 |   12 | +    | 
|     8 |   57 | -    | 
|     9 |   48 | -    | 
|    10 |   72 | -    | 
|    11 |   15 | +    | 
|    12 |   59 | +    | 
|    13 |   52 | +    | 
|    14 |   82 | -    | 
|    15 |   54 | +    | 
|    16 |   25 | -    | 
|    17 |   60 | -    | 
|    18 |   28 | -    | 
|    19 |   60 | +    | 
|    20 |   14 | -    | 
|    21 |   92 | +    | 
|    22 |   19 | -    | 
|    23 |   17 | -    | 
|    24 |   30 | -    | 
|    25 |   98 | +    | 
|    26 |    1 | +    | 
|    27 |   11 | -    | 
+-------+------+------+
27 rows in set (0.00 sec)



to mu dodje startna pozicija ... sad treba da izvedes to sto ti hoces .. ovako izvadis podatke koji ti trebaju (c=znak, b=znak(-1), a=znak(-2))

Code:


mysql> select * , @zzz:=@zz a, @zz:=@z b, @z:=znak c from t1 order by datum, znak;
+-------+------+------+------+------+------+
| datum | broj | znak | a    | b    | c    |
+-------+------+------+------+------+------+
|     1 |   71 | -    | NULL | NULL | -    | 
|     2 |   59 | -    | NULL | -    | -    | 
|     3 |   81 | +    | -    | -    | +    | 
|     4 |   28 | -    | -    | +    | -    | 
|     5 |   97 | -    | +    | -    | -    | 
|     6 |    0 | +    | -    | -    | +    | 
|     7 |   12 | +    | -    | +    | +    | 
|     8 |   57 | -    | +    | +    | -    | 
|     9 |   48 | -    | +    | -    | -    | 
|    10 |   72 | -    | -    | -    | -    | 
|    11 |   15 | +    | -    | -    | +    | 
|    12 |   59 | +    | -    | +    | +    | 
|    13 |   52 | +    | +    | +    | +    | 
|    14 |   82 | -    | +    | +    | -    | 
|    15 |   54 | +    | +    | -    | +    | 
|    16 |   25 | -    | -    | +    | -    | 
|    17 |   60 | -    | +    | -    | -    | 
|    18 |   28 | -    | -    | -    | -    | 
|    19 |   60 | +    | -    | -    | +    | 
|    20 |   14 | -    | -    | +    | -    | 
|    21 |   92 | +    | +    | -    | +    | 
|    22 |   19 | -    | -    | +    | -    | 
|    23 |   17 | -    | +    | -    | -    | 
|    24 |   30 | -    | -    | -    | -    | 
|    25 |   98 | +    | -    | -    | +    | 
|    26 |    1 | +    | -    | +    | +    | 
|    27 |   11 | -    | +    | +    | -    | 
+-------+------+------+------+------+------+
27 rows in set (0.00 sec)




i sad to pokupis kroz subselect i radis sta oces (da se ne bi smarao sa HAVING posto je to mnooooogo sporo

Code:

mysql> set @zzz=NULL;  set @zz=NULL; set @z=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)

mysql> select datum, broj, znak from ( select * , @zzz:=@zz a, @zz:=@z b, @z:=znak c from t1 order by datum, znak) t where t.a=t.b and t.a=t.c;
+-------+------+------+
| datum | broj | znak |
+-------+------+------+
|    10 |   72 | -    | 
|    13 |   52 | +    | 
|    18 |   28 | -    | 
|    24 |   30 | -    | 
+-------+------+------+
4 rows in set (0.00 sec)



jasno?
[ bogdan.kecman @ 03.08.2009. 20:10 ] @
moguce (nisi bas najbolje objasnio) .. da ti treba

Code:

order by broj, datum


ali generalno ... to ti je koncept, dalje valjda mozes sam
[ SrdjanS. @ 03.08.2009. 21:49 ] @
Nije dobro...

Tvoj kod pokazuje BROJ koji je treci u nizu brojeva sa istim znakom, a ne BROJ koji je treci u nizu brojeva sa istim znakom ali i pod istim BROJEM.

Dakle, da pojasnim...
Ovo je deo tvog koda:

| 7 | 12 | + | - | + | + |
| 8 | 57 | - | + | + | - |
| 9 | 48 | - | + | - | - |
| 10 | 72 | - | - | - | - |
| 11 | 15 | + | - | - | + |
| 12 | 59 | + | - | + | + |
| 13 | 52 | + | + | + | + |
| 14 | 82 | - | + | + | - |
| 15 | 54 | + | + | - | + |
| 16 | 25 | - | - | + | - |

on pokazuje da se npr. pre broja 25 (koji ima znak minus), nalazi broj sa znakom + (broj 54), a pre njega broj sa znakom - (broj 82).

Ono sto ja zelim da postignem jeste ovako nesto:

| 7 | 12 | + | - | + | + |
| 8 | 57 | - | + | + | - |
| 9 | 48 | - | + | - | - |
| 10 | 72 | - | - | - | - |
| 11 | 25 | - | - | - | - |
| 12 | 59 | + | - | + | + |
| 13 | 52 | + | + | + | + |
| 14 | 25 | - | - | - | - |
| 15 | 54 | + | + | - | + |
| 16 | 25 | - | - | - | - |

dakle, u redu pod brojem 25 stoje sve znaci minus sto govori da je prethodni broj 25 (koji se nalazi u redu 14) takođe negativnog znaka, kao još jedan broj 25 (u redu 11) pre njega.

Mislim da je sada jasnije?
[ bogdan.kecman @ 03.08.2009. 22:08 ] @
jasnije je .. isti princip .. mogao si da probas sam ..

Code:

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)


jel ovo trazis:
Code:

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 | 
+-------+------+------+------+------+------+------+------+------+



tj ... tri uzastopna broja koja imaju isti znak dakle:

Code:

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)



jel sad to sto si trazio?
[ bogdan.kecman @ 03.08.2009. 22:17 ] @
> Mozda ovo ne moze bez PHP-a?

:D .. isto kao sto bi ga napisao u php-u mozes da ga uradis u sql-u
[ SrdjanS. @ 03.08.2009. 22:18 ] @
Citat:
bogdan.kecman: mogao si da probas sam ..


I jesam, ali nisam uspeo!

Izgleda da je to! Hvala ti, mnogo! Mislio sam da cu doci sam do resenja, a sada vidim da nikada ne bih uspeo..


Car si!
[ SrdjanS. @ 03.08.2009. 22:20 ] @
Citat:
bogdan.kecman: > Mozda ovo ne moze bez PHP-a?

:D .. isto kao sto bi ga napisao u php-u mozes da ga uradis u sql-u


Naravno!

Jedan decko me je zbunio tom recenicom i ako ga nisam bas shvatio!??!?! ;)
[ bogdan.kecman @ 03.08.2009. 22:47 ] @
filozofija je jednostavna ... sortiras ih, zapamtis ternutnu i prethodne dve vrednosti i to je to .. imas ih "poredjane" i samo proveris dal su isti ili ne ... najveca filozofija je da odradis sort tako da dobijes rezultat koji ocekujes ...

isto to bi radio i u php-u ..

drugi nacin bi bio (i bio bi zgodniji da trazis vise od 3 uzastopna znaka) da brojis uzastopne znake .. nesto tipa if(znak='+',@plus:=@plus+1,@plus:=0)... al .. to je za neki drugi put :)
[ SrdjanS. @ 09.08.2009. 17:14 ] @
Imam još jedno pitanje, ako želiš da pomogneš.

Ovako si zapamtio trenutnu i prethodne dve vrednosti:
Code:
mysql> select * , @zzz:=@zz a, @zz:=@z b, @z:=znak c from t1 order by datum, znak;


A kako bi zapamtio trenutnu, prethodne dve i sledeću vrednost?
[ bogdan.kecman @ 09.08.2009. 18:05 ] @
ne mozes da zapamtis sledecu vrednost posto jos nisi dosao do nje
[ SrdjanS. @ 09.08.2009. 18:13 ] @
Citat:
bogdan.kecman: ne mozes da zapamtis sledecu vrednost posto jos nisi dosao do nje


Aha.. Hvala.
[ bogdan.kecman @ 09.08.2009. 18:30 ] @
uvek mozes da nacukas stored proceduru ... dobices malo vecu slobodu nego sa cistim sql-om.... mozes da pamtins za "sve" atribute prethodnu vrednost a za ove "jednu vise" pa onda koristis to kao "trenutni" a ono sto je trenutni koristis kao "sledeci" .. mada .. koliko god to "moze da se zvbudzi" .. ili napise u stored proceduri .. nesto u samom konceptu ti tu nije ok ...
[ SrdjanS. @ 10.08.2009. 14:44 ] @
Ono što sam želeo da postignem je to da ako dodje do prekida rezultata sa istim datumom, brojem ali razlicitim znakom da taj rezultat ne prikazuje. Zato sam mislio da nekako uvedem sledecu vrednost...
[ bogdan.kecman @ 10.08.2009. 20:47 ] @
vidim ja da je neko kladjenje u pitanju :D

ko sto rekoh, jedini nacin da uvedes "sledecu vrednost" je da sve ostale pomeris za jedan unazad te onda imas tu "sledecu" kao trenutnu a one "trenutne" kao "malopre" :) ... to ce da radi ok, nije problem, ali ce da bude ruuuuuuuzan sql do prekosutra tako da je onda bolje da napravis neki stored procedure koji to pravi koji trci sa kuisorom preko te tabele ... radi to sto ti treba .. mozda cak napravis i brze iz nekoliko upita i temporary tabelama nego ovako sa ovim forama sa varijablama u upitu :D... za to "kako" da uradis tu stored proceduru ja ne da ti pomognem, stvorio sam neku odbojnost prema njima i mnoogo izbegavam da radim sa njima ... cisto filozofsko razilazenje gde znam da ja nisam u pravu al teram inat...