Jump to content
Che

[MySQL] Cum selectez doar aceste numere din baza de date ?

Recommended Posts

Am o baza de date cu extragerile de la loto care arata cam asa:

DATA N1 N2 N3 N4 N5 N6 MEDIA

1995-01-12 5 13 26 38 37 25 24

1995-01-19 20 32 38 21 5 11 21

1995-01-26 32 27 38 11 10 29 25

1995-02-02 10 36 31 40 3 38 26

1995-02-09 24 11 21 32 22 15 21

1995-02-16 32 5 8 7 22 24 16

1995-02-23 38 31 11 10 8 37 23

1995-03-09 12 25 1 6 22 9 13

1995-03-16 35 10 7 17 27 26 20

1995-03-23 6 4 9 25 32 38 19

1995-03-30 14 20 30 18 10 2 16

1995-04-06 11 23 15 40 4 1 16

1995-04-13 6 27 35 11 22 34 23

1995-04-20 9 4 35 1 31 19 17

1995-04-27 20 4 35 33 12 11 19

1995-05-04 9 6 39 1 7 34 16

1995-05-11 33 2 34 11 30 25 23

1995-05-18 36 27 24 29 25 26 28

Ma 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 !

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 !

@aceveve

Cum 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 by Che
Link to comment
Share on other sites

@Che la ce variante te referi? n2,n3,n4,n5 sau in exemplul tau la:


1995-04-20 9 4 35 1 31 19 17
1995-04-27 20 4 35 33 12 11 19
1995-05-04 9 6 39 1 7 34 16
1995-05-11 33 2 34 11 30 25 23
1995-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 ";" :)

Link to comment
Share on other sites

@Che la ce variante te referi? n2,n3,n4,n5 sau in exemplul tau la:


1995-04-20 9 4 35 1 31 19 17
1995-04-27 20 4 35 33 12 11 19
1995-05-04 9 6 39 1 7 34 16
1995-05-11 33 2 34 11 30 25 23
1995-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 !

Link to comment
Share on other sites

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 :)

Link to comment
Share on other sites

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 :)

Link to comment
Share on other sites

@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

Link to comment
Share on other sites

@nedo

M-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 !

Link to comment
Share on other sites

  • Active Members
@nedo

M-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 ?

Link to comment
Share on other sites

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.

@MrGrj

Deci ?...

Edited by Che
Link to comment
Share on other sites

  • Active Members

Fii atent, ce am nevoie ca sa te ajut:

- un model de tabel din MySQL.

- vectorul pe care il ai in cpp

MAi 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 ?

Link to comment
Share on other sites

Fii atent, ce am nevoie ca sa te ajut:

- un model de tabel din MySQL.

- vectorul pe care il ai in cpp

MAi 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:

nl7bzb.jpg

//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 !

Link to comment
Share on other sites

  • Active Members

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 or
nr2 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) and nr2 is not null or
nr3 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) and nr3 is not null or
nr4 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) and nr4 is not null or
nr5 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) and nr5 is not null or
nr6 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 by MrGrj
Link to comment
Share on other sites

Asa arata tabelul:

nl7bzb.jpg

//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 NUMAR
WHERE prim = TRUE
Group By id_extragere
Having 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 by tjt
Link to comment
Share on other sites

  • Active Members
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
from NUMAR
Where prim = TRUE
Group By id_extragere
Having 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) or
nr2 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) or
nr3 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) or
nr4 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) or
nr5 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47) or
nr6 in (2, 3, 5, 7, 11, 13, 23, 29, 31, 37, 41, 43, 47);

//acum ar trebui sa mearga linkul

Edited by MrGrj
Link to comment
Share on other sites

  • Active Members

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.

  • Upvote 1
Link to comment
Share on other sites

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

Link to comment
Share on other sites

  • Active Members

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.

Link to comment
Share on other sites

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. @MrGrj

Multumesc mult de tot pentru ajutor !

Edited by Che
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...