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 :

Requete SELECT avec LIKE et =


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 14
    Par défaut Requete SELECT avec LIKE et =
    bonjours,
    j'ai une base de donnée avec 330.000 entrées qui contient tous les mots francais.
    Le probleme c'est quand je lance la requete:
    MySQL n'a retourné aucun enregistrement. (traitement: 2.4991 sec.)requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL:SELECT * 
    FROM `fr` 
    WHERE `mot` LIKE CONVERT( _utf8 'avoir'
    USING latin1 ) 
    COLLATE latin1_swedish_ci
    LIMIT 0 , 30
    par exemple il y a aucun resultat , idem avec =
    seul like %% fonctionne.

    de plus le traitement est super long 2,5sec
    La base de donnée est en MYisam , j'ai essayé de passer en memory(je pense que c'est plus rapide non?) mais j'ai l'erreure suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Erreur
    requête SQL:  
     
    ALTER TABLE `fr` ENGINE = memory 
     
    MySQL a répondu: 
     
    #1114 - La table '#sql-1954_a' est pleine
    pour info j'utilise easy php 2
    je suis sous vista j'ai un E5200 avec 2GO de ram

  2. #2
    Membre extrêmement actif
    Avatar de kedare
    Homme Profil pro
    SRE
    Inscrit en
    Juillet 2005
    Messages
    1 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : SRE

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 549
    Par défaut
    Like '%blabla%' n'utilise pas les indexes, c'est lent,
    Quant a ton message pour le passage en table memory, il me semble que c'est parce que ta table dépasse la taille limite configuré par défaut pour les tables memory

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Un LIKE sans caractère générique (%) ne sert à rien et est équivalent à un =.
    Si le mot recherché est exact, utilise =.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM fr
    WHERE mot = CONVERT( _utf8 'avoir' USING latin1 ) COLLATE latin1_swedish_ci
    LIMIT 0 , 30
    Si le mot recherché est approximatif, utilise LIKE avec des caractères génériques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM fr
    WHERE mot LIKE CONCAT('%', CONVERT( _utf8 'avoir' USING latin1 ) COLLATE latin1_swedish_ci, '%')
    LIMIT 0 , 30
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 14
    Par défaut
    je crois que mon probleme n'a pas bien été compris:
    lorsque je lance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * 
    FROM `fr` 
    WHERE `mot` LIKE CONVERT( _utf8 'avoir'
    USING latin1 ) 
    COLLATE latin1_swedish_ci
    LIMIT 0 , 30
    j'ai aucun résultat:MySQL n'a retourné aucun enregistrement. (traitement: 0.3720 sec.)
    alors qu'il y a bien un mot avoir!
    par contre like %% (approximatif) fonctionne parfaitement et me retourne avoir et d'autres mots approximatifs etc....
    pour preuve voici le résultat pour like %...%
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
          24043 avoir
     
          24044 avoirdupoids
     
          28271 bavoir
     
          28272 bavoirs
     
          194164 lavoir
     
          194165 lavoirs
     
          259293 ravoir
     
          292179 savoir
     
          292180 savoir-faire
     
          292181 savoir-vivre

  5. #5
    Membre extrêmement actif
    Avatar de kedare
    Homme Profil pro
    SRE
    Inscrit en
    Juillet 2005
    Messages
    1 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : SRE

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 549
    Par défaut
    C'est normal, LIKE ne cherche pas le mot entier, mais surtout que tel chaine est contenu dans tel chaine, si tu veux du mot a mot, tourne toi vers la recherche FULLTEXT (Compatible avec MyISAM seulement)

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par yasoft Voir le message
    je crois que mon probleme n'a pas bien été compris
    Et moi je crois que tu n'as pas compris ce que j'ai écrit et que tu n'as pas vu ma seconde requête.
    Petit bémol sur celle-ci et qui vient de ta requête : j'ai le message suivant à l'exécution :
    #1267 - Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (latin1_swedish_ci,EXPLICIT) for operation 'like'
    Si je supprime le latin trucmuche, ça fonctionne.
    La nouvelle requête est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM fr
    WHERE mot LIKE CONCAT('%', CONVERT( _utf8 'avoir' USING latin1 ), '%')
    LIMIT 0 , 30
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 14
    Par défaut
    j'ai toujours pas réussi
    pour faire très simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * 
    FROM `fr` 
    WHERE `mot` =  'avoir'
    cette requete me retourne aucun résultat pourtant il y a bien le mot avoir dans la base avec like %...% jle trouve mais moi je veut juste avoir l'ID de avoir!
    ca doit venir de la table (surchargé a mon avis? 330.000 entrées!)
    quand je lance la requete dans une autre table tout marche bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * 
    FROM `site` 
    WHERE `pseudo` = CONVERT( _utf8 'yasoft'
    USING latin1 ) 
    COLLATE latin1_swedish_ci
    LIMIT 0 , 30
    Affichage des enregistrements 0 - 0 (1 total, traitement: 0.0003 sec.)

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

Discussions similaires

  1. [VB.NET]Requete SELECT avec un Like
    Par krfa1 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/01/2007, 17h24
  2. Réponses: 4
    Dernier message: 20/06/2006, 11h02
  3. probleme requete select avec 2 colonnes
    Par cricri45000 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/04/2005, 10h39
  4. requete select avec AS remplacement de valeur
    Par pi3141563 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/04/2004, 22h15
  5. requete SELECT avec un nombre constant
    Par gurumeditation dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/07/2003, 20h04

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