O solutie mai economica

Secţiune dedicată începatorilor.

Moderatori: Moderatori, Start Moderator

G_1985
PHPRomania Supporter
Mesaje: 19
Membru din: Dum Sep 04, 2005 6:45 pm

O solutie mai economica

Mesajde G_1985 » Sâm Sep 09, 2006 8:33 pm

In ce consta prb la care vreau sa ii gasesc solutia:
Fiind date 3 tabele:
-primul cu 3 campuri (id_produs,id_marca,id_domeniu)
-al doilea cu 2 campuri (id_marca,nume_marca)
-al treilea tot 2 campuri (id_domeniu,nume_domeniu)

As vrea sa gasesc acele produse(in speta id_produs) ale caror valoare din campurile fie id_marca,fie id_domeniu nu se regasesc in tabelul 2 si 3!Deci practic acele produse care nu au nici o marca si nici un domeniu definit!Daca ma intrebati cum se ajunge la situatia asta pot spune ca nu stiu...dar vreau sa previn!

Solutia mea este sa iau pe rand id_marca si id_domeniu al fiecarui produs si sa vad daca se regaseste in tabelu 2 respectiv 3...dar mi se pare o metoda ce necesita timp de executie destul de mare in cazul in care spre exemplu exista vreo 3000 produse , 1000 marci,50 domenii!

Are cineva vreo idee mai buna?



Avatar utilizator
UnD3aD
Senior Member
Mesaje: 351
Membru din: Lun Apr 10, 2006 2:01 pm
Localitate: Cta
Contact:

Mesajde UnD3aD » Sâm Sep 09, 2006 9:56 pm

select id_produs from produse where id_marca NOT IN (select id_marca from marci) AND id_domeniu NOT IN (select id_domeniu from domenii)
ar trebui sa mearga...
Programming is like chewing a pack of bubble gum. If you chew it all at once you're going to die.
www.onlinecronjobs.com
www.byraul.net
DeviantArt

Avatar utilizator
a4tech
Senior Member
Mesaje: 211
Membru din: Joi Noi 03, 2005 12:55 am
Localitate: Bucuresti
Contact:

Mesajde a4tech » Sâm Sep 09, 2006 9:58 pm

nu stiu de ce te complici cu atitea tabele sincer... eu zic sa le combini pe toate ... iar acele prodese de care spui tu poti sa le treci cu "Nespecificat" daca nu apartinu unu producator cunoscut....
Cu respect Paul !

xtc62
Average Member
Mesaje: 75
Membru din: Lun Iul 31, 2006 12:41 pm
Localitate: Iasi

Mesajde xtc62 » Dum Sep 10, 2006 3:38 pm

UnD3aD scrie:select id_produs from produse where id_marca NOT IN (select id_marca from marci) AND id_domeniu NOT IN (select id_domeniu from domenii)
ar trebui sa mearga...

Cam urat si subquery-urile nu erau suportate inainte de MySQL 4.1 . Mai documenteaza-te.

Cod: Selectaţi tot

SELECT id_produs FROM
   tabel1 LEFT JOIN tabel2 ON ( tabel1.id_marca = tabel2.id_marca )
   LEFT JOIN tabela3 ON ( tabela1.id_domeniu = tabela3.id_domeniu )
WHERE (tabela2.id_marca = NULL) OR  (tabela3.id_domeniu = NULL);
/*
tabela1 (id_produs,id_marca,id_domeniu)
tabela2 (id_marca,nume_marca)
tabela3 (id_domeniu,nume_domeniu)
*/

Iar ca sa previi astfel de anomalii la inserare, stergere sau update poti folosi FK-uri ( foreign keys ) .

G_1985
PHPRomania Supporter
Mesaje: 19
Membru din: Dum Sep 04, 2005 6:45 pm

Mesajde G_1985 » Joi Sep 14, 2006 1:40 pm

Ti-am urmat sfatu xtc62 si m-am interesat si eu de FK-uri...dar din exemplele care le-am vazut in manualul de mysql nu prea imi dau seama cum m-ar ajuta in cazul meu!Mai lumineaza-ma doar un pic k dupa aia imi dau eu seama!

xtc62
Average Member
Mesaje: 75
Membru din: Lun Iul 31, 2006 12:41 pm
Localitate: Iasi

Mesajde xtc62 » Joi Sep 14, 2006 5:02 pm

Sa presupunem ca ai 2 tabele.

Cod: Selectaţi tot

CREATE TABLE parent
(
    par_id      INT NOT NULL,
    PRIMARY KEY (par_id)
) ENGINE = INNODB;

CREATE TABLE child
(
    par_id      INT NOT NULL,
    child_id    INT NOT NULL,
    PRIMARY KEY (par_id, child_id),
    FOREIGN KEY (par_id) REFERENCES parent (par_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE

) ENGINE = INNODB;

In tabela `child`, campul `par_id` este un FK catre key-ul `par_id` din tabela `parent`. Asta inseamna ca daca incerci sa introduci in `child` o valoare x in `par_id` , vei putea face asta doar daca in tabela `parent` exista un rand cu `par_id` = x.

Clauzele "ON DELETE" si "ON UPDATE" vor face ca atunci cand stergi din tabela `parent` un rand, toate randurile corespunzatoare din `child` vor fi si ele sterse. Analog pentru update; daca modifici valoarea `par_id`, toate randurile din `child` care aveau acel `par_id` vor fi modificate.

Detalii aici: http://dev.mysql.com/doc/refman/4.1/en/innodb-foreign-key-constraints.html
Sau aici: http://en.wikipedia.org/wiki/Foreign_key


Înapoi la “PHP Incepători”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 27 vizitatori