IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

not in et not like


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 46
    Points : 41
    Points
    41
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Salut,

    Tu peux peut-être essayer quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    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 ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 46
    Points : 41
    Points
    41
    Par défaut
    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.

  5. #5
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    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.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 46
    Points : 41
    Points
    41
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. NOT IN et NOT EXISTS TRES long
    Par jdonet dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/09/2009, 18h10
  2. Réponses: 1
    Dernier message: 14/10/2008, 12h08
  3. [9i] Not in ou not exists
    Par billout9 dans le forum SQL
    Réponses: 9
    Dernier message: 30/10/2007, 09h36
  4. com.mysql.jdbc.not implemented feature not implemented
    Par med_ellouze dans le forum JDBC
    Réponses: 8
    Dernier message: 02/09/2007, 14h51
  5. Réponses: 10
    Dernier message: 14/12/2006, 12h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo