PB sur résultat de requête dite complexe...

PB sur résultat de requête dite complexe... - SQL/NoSQL - Programmation

Marsh Posté le 13-09-2006 à 21:46:51    

Bonjour à tous !
 
Je m'explique, ma requête est la suivante :

Code :
  1. SELECT *
  2. FROM `acteurscenario` , `acteurmusique` , `acteurdeco` , `acteurmonteur`
  3. WHERE (
  4. (
  5. `acteurscenario`.`scenar_film_id` =17061
  6. )
  7. AND (
  8. `acteurdeco`.`deco_film_id` =17061
  9. )
  10. AND (
  11. `acteurmonteur`.`monteur_film_id` =17061
  12. )
  13. AND (
  14. `acteurmusique`.`musi_film_id` =17061
  15. )
  16. )
  17. LIMIT 0 , 30


Le problème :
si dans acteurscenario je n'ai pas de correspondance à 17061, ça ne me retourne rien.
Si j'ai deux fois 17061 dans acteurscenario, j'ai deux lignes en retour.
 
Or, même si je n'ai rien dans acteurscenario, je veux le reste qui est dans deco, monteur, etc...
Et par la même n'avoir qu'une seule ligne de résultat au lieu de :

Code :
  1. scenar_id  scenar_film_id  scenar_acteur_id  scenar_annee  musi_id  musi_film_id  musi_acteur_id  musi_annee  deco_id  deco_film_id  deco_acteur_id  deco_annee  monteur_id  monteur_film_id  monteur_acteur_id  monteur_annee 
  2. 228029 17061 547688 0 2400 17061 28459 1987 34394 17061 316927 0 5073 17061 158983 1987
  3. 228030 17061 36236 0 2400 17061 28459 1987 34394 17061 316927 0 5073 17061 158983 1987


NB : il y a encore d'autres tables à joindre à cette  :fou:  de requete, et je ne vois pas trop comment jouer avec le left join !!!!
 
Si quelqu'un a la clé de cet étrange chose que je pose là... Je remercie d'avance !
 
@+
lenono

Reply

Marsh Posté le 13-09-2006 à 21:46:51   

Reply

Marsh Posté le 13-09-2006 à 22:42:16    

bon je comprends pas trop ce que tu veux faire, mais qques pistes :
- problème 1 : normal, tu mets une condition "`acteurscenario`.`scenar_film_id` =17061" donc tu auras obligatoirement les lignes qui correspondent
essayes d'ajouter un OR dans ta parenthèse : (acteurscenario.scenar_film_id=17061 OR acteurscenario.scenar_film_id is null)
 
- problème 2 : tu peux ajouter dans ta clause le mot DISTINCT, cela te permettra d'éviter les doublons

Code :
  1. select distinct acteurscenario.scenar_film_id, acteurscenario.* from ...

Reply

Marsh Posté le 14-09-2006 à 10:26:51    

je comprend pas trop ta requete non plus
tu ne fait pas de jointures entre tes tables
tu devrais utiliser des LEFT JOIN

Reply

Marsh Posté le 14-09-2006 à 11:04:00    

Pour le distinct, oui c'est sur ==> suppression des doublons, 'scuse, pas réflechi plus que ça !!!
 
Le left join, je vois bien sur 2 tables : pa ni p'oblem ti male, mais dans mon cas, j'ai environ 10 tables que je voudrais lier dansune rq !
 
Suis je assez clair ?
Merci de votre aide !

Reply

Marsh Posté le 14-09-2006 à 16:17:41    

J'ai à peu pres compris ce qui te dérange, mais ta logique m'échappe completement.
 
Peux tu répondre aux questions suivantes ça devrait permettre aux autres de t'aider car je n'aurais pas le temps avant demain matin :
 
- As tu une table Film quelque part ? Si oui décrit la.
- Quelle colonne tu souhaites obtenir à la fin ?
- Et comment tu comptes n'avoir qu'une seule ligne si tu as deux enregistrement différents pour 17061 dans une de tes quatres tables ?

Reply

Marsh Posté le 14-09-2006 à 17:13:41    

tu peux déjà faire une jointure externe pour ton premier problème (LEFT OUTER JOIN en SQL SERVER/ACCESS, le petit + en ORACLE).
 
Pour ton second problème, c'est normal d'avoir deux lignes. Mais tu auras des valeurs différentes dans certains champs.  
Donc la aussi, tu peux forcer d'avoir qu'une ligne (ROWCOUNT en ORACLe, LIMIT en MYSQL)...  
 

Reply

Marsh Posté le 15-09-2006 à 21:02:50    

Merci de vos réponses !
 
Je suis en mysql, mais je verrai ultérieurement le pb du nombre retourné de résultat.
 
La table film est dans une autre base, je ne veux pas pour le moment faire de jointure dessus.
 
Voici le résultat de mon avancement, les explications à suivre :

Code :
  1. SELECT cast_acteur_id,cost_acteur_id,deco_acteur_id,Af_Acteur_Id,maqui_acteur_id,monteur_acteur_id,
  2.    musi_acteur_id,photo_acteur_id,producteur_acteur_id,scenar_acteur_id,son_acteur_id,reafilmacteur_idact,
  3.    IFNULL(cast_acteur_id,NULL),
  4.    IFNULL(cost_acteur_id,NULL),
  5.    IFNULL(deco_acteur_id,NULL),
  6.    IFNULL(Af_Acteur_Id,NULL),
  7.    IFNULL(maqui_acteur_id,NULL),
  8.    IFNULL(monteur_acteur_id,NULL),
  9.    IFNULL(musi_acteur_id,NULL),
  10.    IFNULL(photo_acteur_id,NULL),
  11.    IFNULL(producteur_acteur_id,NULL),
  12.    IFNULL(scenar_acteur_id,NULL),
  13.    IFNULL(son_acteur_id,NULL),
  14.    IFNULL(reafilmacteur_idact,NULL)
  15.    FROM acteurcasting
  16.    LEFT JOIN acteurcostume ON acteurcasting.cast_film_id = acteurcostume.cost_film_id
  17.    LEFT JOIN acteurdeco ON acteurcostume.cost_film_id = acteurdeco.deco_film_id
  18.    LEFT JOIN acteurfilm ON acteurdeco.deco_film_id = acteurfilm.Af_Film_Id
  19.    LEFT JOIN acteurmaquillage ON acteurfilm.Af_Film_Id = acteurmaquillage.maqui_film_id
  20.    LEFT JOIN acteurmonteur ON acteurmaquillage.maqui_film_id = acteurmonteur.monteur_film_id
  21.    LEFT JOIN acteurmusique ON acteurmonteur.monteur_film_id = acteurmusique.musi_film_id
  22.    LEFT JOIN acteurphoto ON acteurmusique.musi_film_id = acteurphoto.photo_film_id
  23.    LEFT JOIN acteurproducteur ON acteurphoto.photo_film_id = acteurproducteur.producteur_film_id
  24.    LEFT JOIN acteurscenario ON acteurproducteur.producteur_film_id = acteurscenario.scenar_film_id
  25.    LEFT JOIN acteurson ON acteurscenario.scenar_film_id = acteurson.son_film_id
  26.    LEFT JOIN reafilmacteur ON acteurson.son_film_id = reafilmacteur.reafilmacteur_idfilm
  27.    WHERE
  28.     reafilmacteur.reafilmacteur_idfilm = 17061


 
Alors pourquoi tout ça ??
 
1/ une requete est plus rapide que 10 !
 
2/ tout récupérer d'un jet.
 
Contraintes problématiques :
Si un seul champ est à nul, alors plus mysql_num_rows = 0 !
 
Le nombre de résultat par type est totalement variable : de 1 à n ...
 
La description de la table film n'apportera rien saut à dire qu'il y a un ID unique et qu'on retrouve dans les champs idfilm ou film_id selon la fonction des personnes sur le plateau.  
Chacune de ces tables fait le lien film(idfilm)-->lien(idfilm/idpersonne)-->personne(idpersonne)
 
Voilà !
 
En tout cas, merci à tous et bon ouique ;-)


Message édité par le_nono le 16-09-2006 à 21:33:51
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed