tri impossible entre deux tables

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : tri impossible entre deux tables

par furiouslol » 22 déc. 2008, 23:31

En fait quand j'écris

Code : Tout sélectionner

JOIN filmsgenre f ON l.identGenre=f.identgenre AND f.identGenre='1'
je donne a filmsgenre l'alias "f", ce qui fait que f.identGenre , n'est pas ambigue, la requete est bonne telle quelle (et puis j'aime pas réécrire tout le temps les noms des tables, donc je met des alias, que je précise pour chaque champs que j'utilise, ainsi jamais d'ambiguité)

Sinon oui oui poste donc, tant que tu poses des questions précises tu auras des questions précises :)
Par contre si tu veux bien, ouvre un post spécifique pour chacune de tes prochaines question, avec un titre explicite, ca aide ceux qui se posent les memes questions que toi a en voir la résolution

Et n'oublie pas de cliquer sur résolu en haut a gauche de tes posts, pour les memes raisons

par dd59 » 22 déc. 2008, 23:18

merci furiouslol !!!

et désolé pour la syntaxe des requetes...

sans fautes pour toi, j'ai du simplement préciser de quelle table l'identgenre était relié car ambigu...

Code : Tout sélectionner

SELECT l.numero, l.titre, f.genre, a.nom FROM liste l JOIN filmsgenre f ON l.identGenre=f.identgenre AND f.identGenre='1' LEFT JOIN acteurs a ON l.identnom=a.identnom ORDER BY l.numero;
pour changer avec :

Code : Tout sélectionner

SELECT l.numero, l.titre, f.genre, a.nom FROM liste l JOIN filmsgenre f ON l.identGenre=f.identgenre AND filmsgenre.identGenre='1' LEFT JOIN acteurs a ON l.identnom=a.identnom ORDER BY l.numero;
Merci encore car ça m'a fait beaucoup avancer !

je me creuse la tête pour le reste, et si besoin.... je peux reposter...? :oops:


merci encore !!!

par furiouslol » 22 déc. 2008, 08:08

Salut,

Premierement une petite demande pour la syntaxe de vos requetes, c'est plus facile pour nous quand la requete est indentée, que les instructions SQL sont en majuscule , et quand les alias sont utilisés, dans ton cas ca donne

Code : Tout sélectionner

SELECT l.numero, l.titre, f.genre, a.nom FROM liste l, filmsgenre f, acteurs a WHERE l.identGenre=f.identgenre AND l.identnom=a.identnom AND f.identGenre='1' ORDER BY l.numero;
Cette requete ne renvoie rien en effet quand tu n'as pas d'acteur enregistré pour un film donné. Comme tu l'as pressentis, il faut utiliser un LEFT JOIN, et comme j'ai eu parfois des erreurs en melant jointure dans le WHERE et LEFT JOIN, je met tout en JOIN

Code : Tout sélectionner

SELECT l.numero, l.titre, f.genre, a.nom FROM liste l JOIN filmsgenre f ON l.identGenre=f.identgenre AND f.identGenre='1' LEFT JOIN acteurs a ON l.identnom=a.identnom ORDER BY l.numero;

par dd59 » 22 déc. 2008, 00:31

merci furiouslol,

j'ai essayé, et ça fonctionne!! .... j'ai dû en plus, mettre a jour un champ d'un film car il n'apparaissait pas en filtrant son genre, mais, ça fonctionne très bien !! merci encore!!!

@+++ :wink:


mais j'ai un autre problème... (promis apès je sort ! :P ), dans ma table liste, j'ai une troisième (et une quatrième colonne) nommées respectivement identnom et indentnom2. Elles aussi font reference à un chiffre.

Dans une troisième table (liste, filmsgenre, acteurs), la table acteurs j'ai deux colonnes : identnom (primaire) et nom.

Voila mon nouveau problème :

Quand je filtre par genre ça fonctionne (ça on savait déjà), j'ai rajouté ceci :

Code : Tout sélectionner

select numero,titre,genre,nom from liste,filmsgenre,acteurs where liste.identGenre=filmsgenre.identgenre and liste.identnom=acteurs.identnom and filmsgenre.identGenre='1' order by numero
Il me revoit bien ma liste filtrée par genre (ex : thriller pour '1') avec la colonne nom renseignée.... mais le hic c'est lorsque le film n'a pas d'acteur enregistré (d'identnom dont le champ est renseigné), il ne parait pas dans la liste (car le critère de tri est le genre....)... :?:

comment faire pour afficher ma liste filtrée avec le genre sélectionné, et tous les films affichés même ceux qui n'ont pas d'acteurs (ex : Bambi.... c'est qui le piti faon? bah le champ devrait être vide...?non.?). j'ai tenté avec left join et right join mais c'est un massacre...
désol pour mon niveau aussi faiblard....

oula j'espère me faire comprendre...

par furiouslol » 21 déc. 2008, 15:14

Salut,

Des fois on a tellement le nez dans le code (ou la tete dans l'guidon) que certaines choses ne saute pas aux yeux :)

Mais en tout cas dans ton cas en fait tu écris

Code : Tout sélectionner

filmsgenre.genre='1'
Alors que ce champs ne prend jamais cette valeur, du coup pas de résultat. Je pense que tu dois remplacer par

Code : Tout sélectionner

filmsgenre.identGenre='1'
La ca devrait marcher :)

tri impossible entre deux tables

par dd59 » 21 déc. 2008, 13:37

bonjour,

je débute, alors tolérance est de mise !!

je travaille à titre privé avec un serveur apache easyphp 2.0b1. J'ai crée 2 tables (en fait 3 mais si je trouve mon erreur le correctif peut s'appliquer à la troisième table...) :

Une table Liste :

Code : Tout sélectionner

CREATE TABLE `liste` ( `Numero` int(4) NOT NULL, `titre` varchar(255) NOT NULL, `identGenre` char(20) NOT NULL, `identNom` int(4) NOT NULL, `identNom2` int(4) NOT NULL, PRIMARY KEY (`Numero`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
et une table filmsgenre :

Code : Tout sélectionner

CREATE TABLE `filmsgenre` ( `identGenre` varchar(20) NOT NULL, `Genre` varchar(255) NOT NULL, PRIMARY KEY (`identGenre`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `filmsgenre` -- INSERT INTO `filmsgenre` (`identGenre`, `Genre`) VALUES ('12', 'Moto'), ('11', 'Horreur\r'), ('10', 'Historique\r'), ('9', 'Film d animation\r'), ('8', 'X\r'), ('7', 'Thriller/Horreur\r'), ('6', 'Sciences fiction\r'), ('5', 'Rires/Aventure\r'), ('4', 'Rires\r'), ('3', 'Action/Aventure\r'), ('2', 'Action\r'), ('1', 'Thriller\r');

Voiiila..... bon j'ai commencé a créer mes requêtes SQL comme celle-ci :

Code : Tout sélectionner

select numero,titre,genre from liste,filmsgenre where liste.identGenre=filmsgenre.identgenre order by numero
Il me donne ensuite la liste en 3 colonnes (numero, titre,genre)...pour le coup c'est cool... MAIS je galère lorsque je cherche à filtrer, pour que je puisse par exemple, choisir d'afficher que les films du genre = action ou thriller etc...

j'ai essayé avec ça :

Code : Tout sélectionner

select numero,titre,genre from liste,filmsgenre where liste.identGenre=filmsgenre.identgenre and filmsgenre.genre='1' order by numero

mais je n'ai aucun résultat... j'ai tenté aussi avec like mais aucun résultat...je suis sur que la solution est évidente pour beaucoup mais j'avoue qu'a force je ne sais plus quoi faire....(j'ai tenté avec left join et right join mais je dois certainement mal l'utiliser...)

s'iouplait, comment filtrer ma liste de films par genre ? (ex je ne veux que les films d'action".... vla...


merci pour vos idées ::!!! :wink: