Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/03/2011, 02h01   #1
Futur Membre du Club
 
Inscription : juin 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 44
Points : 16
Points : 16
Par défaut not in et not like

Bonjour à tous,

je coince sur un soucis de requete, j'ai une table FILM, et une table Acteur.

Acteur.nom est le champ qui contient les acteur, un par un bien structuré
exemple:
alain delon
léonardo di caprio
etc....

Film.nom est le nom du film qui contient dans un seul champ (et oui) le nom du film et quelques acteur.
exemple
brice de nice - jean dujardin
2012 avec John Cusack et Chiwetel Ejiofor

La query que je dois construire, doit m'afficher les films qui ne contiennent pas d'acteur de ma table Acteur....

Par exemple :

Code :
1
2
SELECT nom FROM Film WHERE nom NOT LIKE '%alain delon%'
SELECT nom FROM Film WHERE nom NOT LIKE '%jean dujardin%'
le problème évidement c'est que le nom d'acteur est une liste, l'utilisateur ne vas pas entrer de valeur

et la query devrait plutot ressembler à

Code :
SELECT nom FROM Film WHERE nom NOT IN (SELECT nom FROM Acteur)
mais ceci recherche exactement le nom recherché

donc au final je devrai avoir quelque chose qui ressemble à ceci :

Code :
SELECT nom FROM table WHERE nom NOT LIKE '%%' NOT IN (SELECT nom FROM Acteur)
Bien évidemment cette dernière query ne fonctionnera pas, j'espère que vous avez bien compris mon problème, sinon demandez plus d'infos.

Merci à qui pourra m'aider
gianni17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 08h30   #2
Membre Expert
 
Avatar de zoom61
 
Homme Vincent ...
Passionné d'informatique
Inscription : janvier 2005
Messages : 1 217
Détails du profil
Informations personnelles :
Nom : Homme Vincent ...
Âge : 39
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Passionné d'informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 1 217
Points : 1 506
Points : 1 506
Envoyer un message via Yahoo à zoom61 Envoyer un message via Skype™ à zoom61
Salut,

Tu peux peut-être essayer quelque chose comme cela :
Code :
1
2
3
4
5
6
7
8
SELECT 
   t1.nom 
FROM 
   film t1
     LEFT JOIN acteur t2
         ON t1.nom = t2.nom
WHERE 
   t2.nom IS NULL
__________________
N'oubliez pas le Tag :

C'est en parvenant à nos fins par l'effort, en étant prêt à faire le sacrifice de profits immédiats en faveur du bien-être d'autrui à long terme, que nous parviendrons au bonheur caractérisé par la paix et le contentement authentique. [Dalaï Lama]
Je ne réponds pas aux messages privés s'ils sont liés à une question du forum

Mon site sur Developpez.com
zoom61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 09h48   #3
Membre Expert
 
Avatar de Nudger
 
Homme Thomas Arnaud
Directeur de projet
Inscription : octobre 2010
Messages : 452
Détails du profil
Informations personnelles :
Nom : Homme Thomas Arnaud
Âge : 36
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Directeur de projet
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2010
Messages : 452
Points : 1 012
Points : 1 012
Envoyer un message via Skype™ à Nudger
Bonjour,

Citation:
Envoyé par gianni17 Voir le message
Film.nom est le nom du film qui contient dans un seul champ (et oui) le nom du film et quelques acteur.
Mettre dans un texte une liste de valeur, ça n'a rien de relationnel (au sens d'un SGBD relationnel), le SQL aura de toute manière du mal à répondre à ce besoin.

Citation:
Envoyé par gianni17 Voir le message
La query que je dois construire, doit m'afficher les films qui ne contiennent pas d'acteur de ma table Acteur....
S'agit-il de trouver les films dont aucun acteur n'est dans la table acteur ?
Ou bien les films dont au moins un acteur n'est pas dans la table acteur ?
__________________
www.nudge.org Surveillez et optimisez vos applications Java
Nudger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 11h00   #4
Futur Membre du Club
 
Inscription : juin 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 44
Points : 16
Points : 16
Citation:
Envoyé par Nudger Voir le message
Bonjour,
Mettre dans un texte une liste de valeur, ça n'a rien de relationnel (au sens d'un SGBD relationnel), le SQL aura de toute manière du mal à répondre à ce besoin.
Tout à fait d'accord avec toi, mais là je reprend une application créé il y a 5 ans par un autre développeur.

Citation:
Envoyé par Nudger Voir le message
S'agit-il de trouver les films dont aucun acteur n'est dans la table acteur ?
Ou bien les films dont au moins un acteur n'est pas dans la table acteur ?
La première solution.
gianni17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 12h05   #5
Membre Expert
 
Avatar de Nudger
 
Homme Thomas Arnaud
Directeur de projet
Inscription : octobre 2010
Messages : 452
Détails du profil
Informations personnelles :
Nom : Homme Thomas Arnaud
Âge : 36
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Directeur de projet
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2010
Messages : 452
Points : 1 012
Points : 1 012
Envoyer un message via Skype™ à Nudger
Donc si je comprends bien pour le cas suivant:
"2012 avec John Cusack et Chiwetel Ejiofor"

- Il faut repérer que dans ce texte il y a les noms "John Cusack" et "Chiwetel Ejiofor"
- Puis vérifier que chacun de ces deux noms n'est pas présent dans la table Acteur

Avant de penser SQL, il faut imaginer l'algorithme qui peut répondre à ce besoin.

Il faut faire une analyse textuelle:
- considérer certains mots tels que " avec " ou " et " ou " - " comme des séparateurs de valeurs
- considérer que la première valeur est le nom du film (mais qu'en est-il quand " et " ou " avec " ou " - " se retrouve dans le nom du film ?)
- à ce moment on peut envisager de chercher les noms dans la table acteur pour vérifier s'ils n'y sont pas (tout en prenant soin d'ignorer la casse)

Et là je ne décris qu'un algorithme permettant d'analyser "2012 avec John Cusack et Chiwetel Ejiofor" ... et celui-ci ne répondra certainement pas aux autres valeurs existante dans cette table.

Bref, à mon sens, il faut normaliser le contenu de ce champ ou encore mieux casser le modèle pour obtenir un modèle relationnel.
__________________
www.nudge.org Surveillez et optimisez vos applications Java
Nudger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 15h12   #6
Futur Membre du Club
 
Inscription : juin 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 44
Points : 16
Points : 16
oula, ça va vraiment être trop compliqué comme ça, vu qu'il y a vraiment beaucoup de records et que les titres de film sont pas tous écrit de la même façon.

Bon ben, je vais faire un cron php qui tournera la nuit et fera paquet par paquet

Code :
1
2
3
SELECT nom FROM film WHERE titre NOT LIKE '%valeur1%'
SELECT nom FROM film WHERE titre NOT LIKE '%valeur2%'
SELECT nom FROM film WHERE titre NOT LIKE '%valeur3%'
etc...
gianni17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h43.


 
 
 
 
Partenaires

Hébergement Web