Salut, am o idee de aplicatie ce implica urmatoarele chestii:
tabel cu actori (nume,data nasterii,etc)
tabel cu filme (titlu,an,etc)
tabel genuri (id,nume)
Acum as vrea sa fac o relatie intre actori -> filme si genuri. Ce vreau sa spun,este sa afisez: filmele in care au jucat actorii X si Y, cu genul Z.
Ceea ce ma duce cu gandul ca trebuie sa fac un tabel de relatie_actor_film (actID,filmID) si relatie_genuri_film (filmID,genID).
Acum, la cautarea dupa nume,se adauga: Jason Statham si Bruce Willis, as dori afisarea filmelor in care au jucat individual:
select from relatie_actor_film where actID=X OR actID=Y
Insa daca as vrea sa iau filmele in care au jucat impreuna?Inseamna sa scot intr-un array toate filmele cu X si Y,apoi sa le parcurg cu if(in_array( mergi mai departe... , insa mi se pare o tampenie.
Voi cum ati proceda?As dori si sa pun accent si pe viteza de procesare.Multumesc !
select id_film, oricealtcevavrei from tabel_distributie where id_actor IN (id_actor1, id_actor2) group by id_film having count(cevaindex) = 2
Evident, presupune din start că filtrezi după id-urile actorilor, deci dacă vei avea 2 rânduri returnate pentru același film, atunci e clar că joacă amândoi în el. Nu văd acum niciun scenariu în care nu ar fi valabilă logica asta.
PS: Ăstora care denumiți coloanele din baza de date cu CamelCase, cu prescurtări și alte prostii d-astea v-aș da drop la tot. No offence!
Haioasa aplicație. Când e gata s-o pui si pe forum pe aici.
Problema ta se mai poate rezolva strict în SQL printr-un join. Mai întâi selectezi toate filmele in care joacă X, apoi toate filmele in care joacă Y, si faci un inner join pe idul de film. În principiu e o intersecție între cele două seturi de rezultate, bazată doar pe filmId. În cod ar arata așa:
Select a.FilmId
From (select * from film_actori where actId=X) a
Join (select * from film_actori where actId=Y) b
On a.FilmId=b.FilmId
Join-ul în sine ar trebui să fie destul de cheap, ca o sa fie in memorie pentru seturi de date realistice (câteva sute de filme max pentru cei mai prolifici actori). Dar trebuie să ai un index pe actId în tabelul film_actori, altfel lookup-ul o să fie costisitor.
Eu cred ca ar trebuii sa citesti mai mult despre SQL,ORM si DOCTRINE, mie unele idei solutii imi vin efectiv atunci cand programez ceva, deci pe moment.
Îți mulțumesc pentru că m-ai făcut să zâmbesc de dimineață.
OnTopic: Eu nu aș recomanda unui începător utilizarea oricărei alte baze de date în afară de (My)SQL. Realist vorbind, sunt mult mai multe șanse să lucrezi zilnic cu așa ceva și e bine să te lovești de chestii d-astea mai ciudate ca să știi pe viitor de unde s-o apuci, cum e mai bine să construiești baza de date și ce poți face cu ea.