Pagina 1 din 1

O solutie mai economica

Scris: Sâm Sep 09, 2006 8:33 pm
de G_1985
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?

Scris: Sâm Sep 09, 2006 9:56 pm
de UnD3aD
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...

Scris: Sâm Sep 09, 2006 9:58 pm
de a4tech
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....

Scris: Dum Sep 10, 2006 3:38 pm
de xtc62
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 ) .

Scris: Joi Sep 14, 2006 1:40 pm
de G_1985
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!

Scris: Joi Sep 14, 2006 5:02 pm
de xtc62
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