Che Posted February 21, 2015 Report Posted February 21, 2015 Am o baza de date cu extragerile de la loto care arata cam asa:DATA N1 N2 N3 N4 N5 N6 MEDIA1995-01-12 5 13 26 38 37 25 241995-01-19 20 32 38 21 5 11 211995-01-26 32 27 38 11 10 29 251995-02-02 10 36 31 40 3 38 261995-02-09 24 11 21 32 22 15 211995-02-16 32 5 8 7 22 24 161995-02-23 38 31 11 10 8 37 231995-03-09 12 25 1 6 22 9 131995-03-16 35 10 7 17 27 26 201995-03-23 6 4 9 25 32 38 191995-03-30 14 20 30 18 10 2 161995-04-06 11 23 15 40 4 1 161995-04-13 6 27 35 11 22 34 231995-04-20 9 4 35 1 31 19 171995-04-27 20 4 35 33 12 11 191995-05-04 9 6 39 1 7 34 161995-05-11 33 2 34 11 30 25 231995-05-18 36 27 24 29 25 26 28Ma poate ajuta cineva cu o sintaxa care sa faca urmatorul lucru:Sa imi afiseze doar acele extrageri care au MEDIA intre 15 si 20 dar doar acelea care contin numerele 20 si 30 ?(in cazul de fata este doar una singura, cea evidentiata de mine cu galben)Multumesc mult ! Quote
nedo Posted February 21, 2015 Report Posted February 21, 2015 Pe ce platforma ai nevoie de aplicatie?Descarci libraria MySqlConnecter/C++ pentru a te putea conecta la mysql.Acum.Presupunand ca fiecare informatie este in campul ei, faci o interogare ce iti returneaza datele pe cate 1 rand, 1 string, si restul int-uri. Verifici intai ultimul int, media, dupa care treci prin celelalte elemente, si verifici daca sunt egale cu ce verifici tu.Un exemplu ar fi sa salvezi totul intr-un map. key-a este data(string), si valoarea este un vector(in care pui cele 6 numere si media - ultimul numar). Totusi nu e o metoda tocmai ok pentru ca folosesti multa memorie. O alta metoda ar fi sa folosesti un string temporar si un vector temporar in care stochezi informatile de pe cate un rand, si daca ele corespund criteriilor abea atunci le introduci intr-un map(ca cel de sus), si il printezi la sfarsit. Daca nu iti iese posteaza si incerc sa iti fac ceva. Quote
aceveve Posted February 21, 2015 Report Posted February 21, 2015 select * from tabel where (media<=20 and media>=15) and (20 in (n1,n2,n3,n4,n5,n6) and 30 in (n1,n2,n3,n4,n5,n6));Ajuta? 1 Quote
Che Posted February 21, 2015 Author Report Posted February 21, 2015 (edited) select * from tabel where (media<=20 and media>=15) and (20 in (n1,n2,n3,n4,n5,n6) and 30 in (n1,n2,n3,n4,n5,n6));Ajuta?Da, multumesc ! @aceveveCum fac, sa zicem, sa iau in considerare doar ultimele 5 variante si nu toate ? Adica sa-mi caute doar in ultimele 5 si nu in toate.Multumesc mult ! Edited February 22, 2015 by Che Quote
aceveve Posted February 22, 2015 Report Posted February 22, 2015 @Che la ce variante te referi? n2,n3,n4,n5 sau in exemplul tau la:1995-04-20 9 4 35 1 31 19 171995-04-27 20 4 35 33 12 11 191995-05-04 9 6 39 1 7 34 161995-05-11 33 2 34 11 30 25 231995-05-18 36 27 24 29 25 26 28 Pentru prima varianta scoti din "in" n1 iar pentru a 2-a adaugi la sfarsit "order by data desc limit 5", desigur inaintea lui ";" Quote
Che Posted February 24, 2015 Author Report Posted February 24, 2015 @Che la ce variante te referi? n2,n3,n4,n5 sau in exemplul tau la:1995-04-20 9 4 35 1 31 19 171995-04-27 20 4 35 33 12 11 191995-05-04 9 6 39 1 7 34 161995-05-11 33 2 34 11 30 25 231995-05-18 36 27 24 29 25 26 28 Pentru prima varianta scoti din "in" n1 iar pentru a 2-a adaugi la sfarsit "order by data desc limit 5", desigur inaintea lui ";" Vreau sa-mi caute si sa-mi afiseze toate variantele care contin 20 si 30 si au media intre 15 si 20 dar doar in ultimele 5 extrageri din lista de extrageri date de mine ca exemplu. Deci eu le am pe toate in tabel, nu doar ultimele 5 insa el sa le vada doar pe ultimele 5. Cum anume ar trebui sa fie sintaxa MySQL ?Dar daca vrei in primele 5 ?Scrie tu, te rog, sintaxa MySQL ca eu nu prea ma pricep si nici nu am inteles ce ai vrut sa zici. Am zis ca o sa mai recitesc ca sa vad poate inteleg insa nu am inteles ce ai vrut sa spui.Multumesc mult ! Quote
aceveve Posted February 24, 2015 Report Posted February 24, 2015 Ultimele 5: select * from tabel where (media<=20 and media>=15) and (20 in (n1,n2,n3,n4,n5,n6) and 30 in (n1,n2,n3,n4,n5,n6)) order by data desc limit 5;Primele 5:select * from tabel where (media<=20 and media>=15) and (20 in (n1,n2,n3,n4,n5,n6) and 30 in (n1,n2,n3,n4,n5,n6)) order by data limit 5;P.S. o sa functioneze doar daca tipul coloanei data este de tip date, daca e text, varchar, etc o sa returneze rezultate neadevarate. Daca nu este de tip date poti schimba acum si cu siguranta nu iti va afecta scriptul Quote
EAdrian Posted February 25, 2015 Report Posted February 25, 2015 first of all.. ?ie-?i trebuie un primary key..iar pentru dat? folose?te unix timestamp (sfatul meu) Quote
Che Posted February 25, 2015 Author Report Posted February 25, 2015 Multumesc mult pentru ajutor ! Quote
aceveve Posted February 25, 2015 Report Posted February 25, 2015 N-ai pentru ce.Da, asa cum spune si @EAdrian tu folosesti timestamp si atunci cand ai nevoie doar de data, nu si de ora? Daca da, de ce? Te intreb pentru ca ai o experienta mai mare ca a mea si poate eu gresesc folosind date cand am nevoie doar de data si timestamp cand am nevoie si de ora. Mersi anticipat pentru raspuns Quote
Dubfx Posted February 25, 2015 Report Posted February 25, 2015 Pentru ca timestamp este de fapt un integer pe care il poti stoca si indexa ca atare. Quote
EAdrian Posted February 25, 2015 Report Posted February 25, 2015 @aceveve eu folosesc mereu timestamp când este vorba de timp. Nu ?tii când ai nevoie de data sau un "order by date"...plus de asta, este mult mai u?or s? iei individual data, ziua, ora, etc. decât s? despar?i un string sau s?-l converte?ti tot în unix timestampÎn cazul de fa?? dac? ar folosi varchar pentru dat? ar mânca 11 bi?i, pe când int doar 4 bi?i Quote
Che Posted November 24, 2015 Author Report Posted November 24, 2015 @nedoM-am reapucat sa lucrez la acest program si mi-am dat seama ca daca vreau sa lucrez cu baze de date mi-ar fi mult mai usor daca as sti cum sa fac urmatoarea chestie:Am un grup de numere cu valori de la 1 la 49, sa zicem gurpul A.A ={8,12,18,23,29,32,37,40,42,45,49}Cum fac sa extrag din baza de date (spre exemplu din cea data ca exemplu in primul post) doar acele extrageri care contin:-> Exact 3 numere din grupul A, oricare trei, nu conteaza.-> Mai putin sau egal cu 4 numere din grupul A, aici vor fi incluse variante care nu contin nici un numar, variante care contin 1, 2, 3 si 4 numere din grupul A, nu conteaza care anume.-> Intre 2 si 4 numere din grupul A, nu conteaza care numere anume din grupul A.Multumesc mult pentru ajutor si scuze de reinvierea acestui topic ! Quote
Active Members MrGrj Posted November 24, 2015 Active Members Report Posted November 24, 2015 @nedoM-am reapucat sa lucrez la acest program si mi-am dat seama ca daca vreau sa lucrez cu baze de date mi-ar fi mult mai usor daca as sti cum sa fac urmatoarea chestie:Am un grup de numere cu valori de la 1 la 49, sa zicem gurpul A.A ={8,12,18,23,29,32,37,40,42,45,49}Cum fac sa extrag din baza de date (spre exemplu din cea data ca exemplu in primul post) doar acele extrageri care contin:-> Exact 3 numere din grupul A, oricare trei, nu conteaza.-> Mai putin sau egal cu 4 numere din grupul A, aici vor fi incluse variante care nu contin nici un numar, variante care contin 1, 2, 3 si 4 numere din grupul A, nu conteaza care anume.-> Intre 2 si 4 numere din grupul A, nu conteaza care numere anume din grupul A.Multumesc mult pentru ajutor si scuze de reinvierea acestui topic !Sunt la work acum. O sa updatez postul asta si iti zic. Pana atunci, zi-mi ce intelegi prin "grup". Cum ai stocat"grupul" ala in baza de date. Un numar intr-o singura coloana ? Quote
Che Posted November 24, 2015 Author Report Posted November 24, 2015 (edited) Sunt la work acum. O sa updatez postul asta si iti zic. Pana atunci, zi-mi ce intelegi prin "grup". Cum ai stocat"grupul" ala in baza de date. Un numar intr-o singura coloana ?In primul rand multumesc mult de tot pentru ajutor.In al doilea rand, grupul ala nu e stocat in baza de date, este "dedus"/rezulta pe baza analizei extragerilor care deja au avut loc, e variabil de la extragere la extragere si de la loterie la loterie dar nu variaza de la o zi la alta ci variaza de la o extragere la alta, iar alteori nu variaza de la extragere la extragere ci doar de la o loterie la alta.Ca sa intelegi mai bine la ce ma refer, acel grup poate cuprinde doar numerele prime de la 1 la 49, care la loteria 5 din 40 poate fi de la 1 la 40, prime iar la loteria 6 din 90 avem de-a face cu numerele prime de la 1 la 90.Am dat doar un exemplu cu numere prime dar poate fi orice grup de numere presetat de tine la o adica si stocat intr-un vector in C++ la un moment dat. @MrGrjDeci ?... Edited November 25, 2015 by Che Quote
Active Members MrGrj Posted November 25, 2015 Active Members Report Posted November 25, 2015 Fii atent, ce am nevoie ca sa te ajut:- un model de tabel din MySQL.- vectorul pe care il ai in cppMAi mult, explica asta:In al doilea rand, grupul ala nu e stocat in baza de date, este "dedus"/rezulta pe baza analizei extragerilor care deja au avut loc, e variabil de la extragere la extragere si de la loterie la loterie dar nu variaza de la o zi la alta ci variaza de la o extragere la alta, iar alteori nu variaza de la extragere la extragere ci doar de la o loterie la alta.Dupa ce grupul ( banuiesc ca te referi la vectorul care are ceva numere in el ) este dedus, unde e salvat ? Sau ce se intampla cu el ? Care e functia care face asta ? Cum returnezi acest obiect ? Quote
Che Posted November 25, 2015 Author Report Posted November 25, 2015 Fii atent, ce am nevoie ca sa te ajut:- un model de tabel din MySQL.- vectorul pe care il ai in cppMAi mult, explica asta:Dupa ce grupul ( banuiesc ca te referi la vectorul care are ceva numere in el ) este dedus, unde e salvat ? Sau ce se intampla cu el ? Care e functia care face asta ? Cum returnezi acest obiect ?Asa arata tabelul://predefinit in codul sursa:int prime = {2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47};Sau poti sa "produci" la runtime toate numerele prime de la 1 la 49 si apoi sa le incarci in vectorul "prime".Acum te contectezi la baza de date mysql si extragi din baza de date doar acele extrageri care au mai mult de trei numere prime sau mai putin de 3 numere prime sau care au intre 1 si 3 numere prime (deci cele fara nici un numar prim ar fi eliminate (nu ar fi extrase) in acest caz).In general numerele din vector sunt predefinite dar pot exista cazuri si in care pot fi generate atunci cand rulezi programul.Numerele din vector (matrice unidimensionala mai exact) nu sunt stocate nicaeri ca nu avem nevoie de ele, doar extragerile din baza de date conteaza.Multumesc ! Quote
Active Members MrGrj Posted November 25, 2015 Active Members Report Posted November 25, 2015 (edited) Lol, daca unesc conditiile tale => vrei toate `liniile` care contin oricate numere prime. Right ?Anyway, cea mai usoara solutie care mi-a venit in minte ( usoara pentru tine - am incercat sa nu creez functii in SQL ca sa iti fie mai usor ) ar fi urmatoarea:SELECT nr1,nr2,nr3,nr4,nr5,nr6 FROM numbers where nr1 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) and nr1 is not null ornr2 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) and nr2 is not null ornr3 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) and nr3 is not null ornr4 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) and nr4 is not null ornr5 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) and nr5 is not null ornr6 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) and nr6 is not null ;Ai aici un exemplu. E ok ? @Che Edited November 25, 2015 by MrGrj Quote
tjt Posted November 25, 2015 Report Posted November 25, 2015 (edited) Asa arata tabelul://predefinit in codul sursa:int prime = {2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47};Sau poti sa "produci" la runtime toate numerele prime de la 1 la 49 si apoi sa le incarci in vectorul "prime".Acum te contectezi la baza de date mysql si extragi din baza de date doar acele extrageri care au mai mult de trei numere prime sau mai putin de 3 numere prime sau care au intre 1 si 3 numere prime (deci cele fara nici un numar prim ar fi eliminate (nu ar fi extrase) in acest caz).In general numerele din vector sunt predefinite dar pot exista cazuri si in care pot fi generate atunci cand rulezi programul.Numerele din vector (matrice unidimensionala mai exact) nu sunt stocate nicaeri ca nu avem nevoie de ele, doar extragerile din baza de date conteaza.Multumesc !De ce ai in tabel numar 1, numar 2, numar 3 ? Asta incalca regulile de normalizare.Mai bine faci un tabel NUMAR[id_extragere, numar].Si dupa lucrezi pe tabelul NUMAR. Nu stiu MySQL, dar exista functie de numere prime in mysql ? Ai putea in tabelul NUMAR[id_extragere,numar] sa adaugi inca un camp denumit PRIM ce are valoare TRUE/FALSE sau 0/1.NUMAR[id_extragere, numar, prim]Acum totul se rezuma la cateva interogari.SELECT id_extragere, COUNT(numar) AS 'nr prime'FROM NUMARWHERE prim = TRUEGroup By id_extragereHaving COUNT(numar) > 3 ;Faci ceva in genul de mai sus [posibil ca interogare sa o fi scris gresit, nu am mai utilizat SQL in ultimul timp] pentru a afla extragerile care au peste 3 numere prime si tot asa.Edit: @MrGrj poti pune in alta parte Error 404 Not Found deoarce imi apare blank page. Vreau sa vad ce fel ai facut. Thanks.Edit2: Am vazut ca ai postat in topic... xD Edited November 25, 2015 by tjt Quote
Active Members MrGrj Posted November 25, 2015 Active Members Report Posted November 25, 2015 (edited) De ce ai in tabel numar 1, numar 2, numar 3 ? Asta incalca regulile de normalizare.Mai bine faci un tabel NUMAR[id_extragere, numar].Si dupa lucrezi pe tabelul NUMAR. Nu stiu MySQL, dar exista functie de numere prime in mysql ? Ai putea in tabelul NUMAR[id_extragere,numar] sa adaugi inca un camp denumit PRIM ce are valoare TRUE/FALSE sau 0/1.NUMAR[id_extragere, numar, prim]Acum totul se rezuma la cateva interogari.Select id_extragerefrom NUMARWhere prim = TRUEGroup By id_extragereHaving COUNT(numar) > 3 ;Faci ceva in genul de mai sus [posibil ca interogare sa o fi scris gresit, nu am mai utilizat SQL in ultimul timp] pentru a afla extragerile care au peste 3 numere prime si tot asa.Edit: @tjt am scris mai sus. Merge si cum zici tu, insa nu am vrut sa complic sintaxa cu ceva functie in SQL pentru ca nu e nevoie. Momentan am ceva probleme cu SQLfiddle ( ar trebui sa fie usor de reprodus anyway)Apropo, che, poti sterge partile cu "and nr1 is not null .. and nr6 is not null " Anyway, pentru ca nu merge SQLFiddle uite aici:CREATE TABLE numbers ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, dataceva DATE, nr1 varchar(6), nr2 varchar(6), nr3 varchar(6), nr4 varchar(6), nr5 varchar(6), nr6 varchar(6));INSERT INTO numbers (nr1, nr2, nr3, nr4, nr5, nr6) VALUES (1,4,6,8,10,12),(10,22,13,14,22,6),(1,21,32,37,23,26);Querry-ul e cel de mai sus:SELECT nr1,nr2,nr3,nr4,nr5,nr6 FROM numbers where nr1 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) ornr2 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) ornr3 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) ornr4 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) ornr5 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) ornr6 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47);//acum ar trebui sa mearga linkul Edited November 25, 2015 by MrGrj Quote
Che Posted November 25, 2015 Author Report Posted November 25, 2015 @MrGrjMultumesc mult amandorura pentru ajutor ! Quote
Active Members MrGrj Posted November 25, 2015 Active Members Report Posted November 25, 2015 Nu e bine, nu imi trebuie variantele care au oricate numere prime. Imi trebuie sa zicem toate variantele care au mai putin de 3 numere prime (luate din vectorul "prime").Cum faci asta ?Poti face asa:SELECT nr1,nr2,nr3,nr4,nr5,nr6 FROM numbers where ( case when nr1 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end + case when nr2 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end + case when nr3 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end + case when nr4 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end + case when nr5 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end + case when nr6 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end) in (1,2);Sa inteleg ca in loc de (2,3...,47) vrei o variabila care sa tina locu' vectorului, nu ? O singura intrebare: query-ul il faci in C++ sau rulezi direct in mysql ? //Ma culc, restu' maine seara. 1 Quote
Che Posted November 26, 2015 Author Report Posted November 26, 2015 Poti face asa:SELECT nr1,nr2,nr3,nr4,nr5,nr6 FROM numbers where ( case when nr1 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end + case when nr2 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end + case when nr3 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end + case when nr4 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end + case when nr5 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end + case when nr6 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) then 1 else 0 end) in (1,2);Sa inteleg ca in loc de (2,3...,47) vrei o variabila care sa tina locu' vectorului, nu ? O singura intrebare: query-ul il faci in C++ sau rulezi direct in mysql ? //Ma culc, restu' maine seara.Sa inteleg ca in loc de (2,3...,47) vrei o variabila care sa tina locu' vectorului, nu ? Nu. Pur si simplu sa verifice cate numere din vector are fiecare varianta si daca indeplineste conditiile atunci varianta/variantele respective sa fie extrase din baza de date. Atat.O singura intrebare: query-ul il faci in C++ sau rulezi direct in mysql ? In C++ creez conexiune si apoi ii dau query-ul tot in C++. Quote
Active Members MrGrj Posted November 26, 2015 Active Members Report Posted November 26, 2015 Transformi vectorul in string:std::stringstream ss;for(size_t i = 0; i < prime.size(); ++i){ if(i != 0) ss << ","; ss << prime[i];}std::string s = ss.str();Si apoi in loc de (2,3..,47) adaugi SQL Query + "s" + rest of SQL Query. Cauta si tu pe net ca tre' sa gasesti. Momentan am putina treaba. Quote
Che Posted November 27, 2015 Author Report Posted November 27, 2015 (edited) Transformi vectorul in string:std::stringstream ss;for(size_t i = 0; i < prime.size(); ++i){ if(i != 0) ss << ","; ss << prime[i];}std::string s = ss.str();Si apoi in loc de (2,3..,47) adaugi SQL Query + "s" + rest of SQL Query. Cauta si tu pe net ca tre' sa gasesti. Momentan am putina treaba.Multumesc mult pentru ajutor !.................................................................................................................................LE: Ca sa nu mai fac alt topic care e legat tot de asta, m-am gandit sa intreb aici.Sa zicem ca aplic query-ul asta si imi da din baza de date 15 extrageri ca rezultat.1. Cum fac ca sa "stiu" in programul meu, adica sa stochez intr-o variabila int nr_extrageri; acest 15 sau cate extrageri rezulta in urma aplicarii query-ului ?2. Cum fac sa incarc rezultatul, adica cele 15 extrageri, intr-un vector sau matrice bidimensionala ?ex. 15 extrageri rezultate x 6 numere fiecare = 90 de numere care trebuie incarcate in matrice, FARA sa mai incarci si data extragerii sau media sau alte campuri care mai sunt ?//matricea bidimensionala la care ma refer int a[15][6]; sau un vector. @MrGrjMultumesc mult de tot pentru ajutor ! Edited November 30, 2015 by Che Quote