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?
O solutie mai economica
Moderatori: Moderatori, Start Moderator
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...
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
www.onlinecronjobs.com
www.byraul.net
DeviantArt
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 ) .
Sa presupunem ca ai 2 tabele.
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
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
Cine este conectat
Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 15 vizitatori