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

Langage SQL Discussion :

[Amateur] faire une recherche sur les deux premiers caractères.


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut [Amateur] faire une recherche sur les deux premiers caractères.
    Messieurs bonjour,

    J'ai un problème sur le site du boulot que j'aimerais résoudre car les visiteurs sont perturbé.

    je m'explique, sur notre site www.novicase.com nous avons une carte de france. Sur cette carte lorsque vous cliqué sur un département la page doit afficher les distributeurs se situant dans se département (logique)

    seulement il y a un petit souci qui est le suivant, si vous cliquez sur l'aisne (02) le résultat va afficher tous les revendeurs des département ayant un code postale contenant un 2. (ceux du 21 par exemple).

    Si vous voulez tester pour vous en rendre comptes:

    http://www.novicase.com/distri.php

    Allez sur la page et cliquer sur le 02 (Aisne) il va vous afficher les distributeurs du 25 et du 21 et pas du 02 (normal je n'en ai pas dans le 02)

    A mon avis l'erreur viens de la requete SQL. Je vous mets donc une copie de la requete SQL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
    FROM magasin LEFT OUTER JOIN enseigne ON num_enseigne=id_enseigne 
    WHERE cp_magasin like '$dept%' AND afficher_carte=1
    A mon avis l'option LIKE n'est pas la bonne mais je ne vois pas laquelle utiliser.

    N'étant pas un pro du SQL j'ai fait quelque recherche mais je ne trouve pas se qui pourrais aller ou alors je ne vois pas comment l'appliquer à ma requete.

    J'ai pensé à l'option TRIM TRAILING et ensuite à la place du LIKE mettre un = mais je ne sais pas me servir de cette fonction et à chaques fois ma requete ne marche pas.

    je vous remercie par avance.
    Maxime

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Pourquoi ne pas faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    WHERE cp_magasin = '$dept' 
    ...
    Donnez-nous un extrait du contenu de vos tables magasin et enseigne et un exemple du résultat souhaité que vous n'arrivez pas à obtenir.
    Enfin, indiquez votre SGBD et sa version.

  3. #3
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    L'erreur ne vient-elle pas du fait que [$dept] est un entier (2) et non une chaine de caractères ('02') ?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 108
    Points : 28 424
    Points
    28 424
    Par défaut
    Vérifie le contenu de ta variable... Elle vaut certainement '2' et non '02'.
    Le SQL n'est pas en cause.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci de vos réponse,

    je vais essayer de trouver des éléments de réponses à vos questions car ce n'est pas moi qui ai fait le site donc il faut que je fasse mes recherche pour bien comprendre le système.

    Pour la version voila ce que j'ai:

    Détails serveur:
    DNS primaire: ns1.lwsweb8.com
    Asp Version: 3
    Asp.net version: Framework 1.1& 2
    Php version: 4.4.X & 5.1
    Mysql version: 4.X.X
    Myadmin vers: 2.7.0
    Version MDAC: 2.8
    Myodbc: oui - Vers 3.51
    voici un print ecran de la table :



    vous pouvez cliquer dessu pour l'afficher en grand.

    Merci de votre aide

  6. #6
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    Il faudrait connaitre le type de la colonne cp_magasin (entier ou chaine de caractère ?)

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Le type de la colonne CP_magasin est :

    varchar(5)

    J'espere que c'est la bonne réponse que j'ai donné.

    En fait je ne suis pas un spécialiste de l'informatique mais on m'a confié le poste de responsable commercial et pour moi avoir un site un internet est un bon outil si il marche correctement ;

    C'est pour cela que j'ai décidé de remettre le site en "etat" afin que les clients potentiel ne soit pas perdu et surtout cela ne donne pas une image sérieuse de la société.

    je vous remercie de votre écoute et de votre aide.

    Maxime

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonsoir à tous,

    alors je pense avoir une idée ou une solution mais il faudrais que vous me dites si c'est possible ou pas.

    Je vous redonne la requete SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $query = 
    SELECT * 
    FROM magasin LEFT OUTER JOIN enseigne ON num_enseigne=id_enseigne 
    WHERE cp_magasin like '$dept%' 
    AND afficher_carte=1;
    La variable $dept correspond au numéro de département sur lequel l'utilisateur à cliquer.

    Par ex 02

    Ce qui donne en clair sans PHP:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	$query = "SELECT * 
    FROM magasin LEFT OUTER JOIN enseigne ON num_enseigne=id_enseigne 
    WHERE cp_magasin like '02%' 
    AND afficher_carte=1";
    Maintenant mon problème est que la requete cherche un resultat se rapprochant du 02 dans la chaine du champs qui correspond à cp_magasin.

    Mon idée serait de remplacer le Like par un =.

    Seulement on peut comparer que deux chaine de caractère identique si mes souvenirs sont bon. C'est à dire une chaine de 2 caractère mon 02 n'est pas comparable à une chaine de 5 caractères comme l'est ma chaine de code postale.

    Ma question est donc comment dans ma requete lui demander de comparer mon 02 uniquement avec les deux premiers caractères de la chaine cp_magasin?

    La partie à modifier doit donc etre la partie en bleu si dessou.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	$query = 
    SELECT * 
    FROM magasin LEFT OUTER JOIN enseigne ON num_enseigne=id_enseigne 
    WHERE  cp_magasinlike '$dept%' 
    AND afficher_carte=1;
    J'espere que je me suis fait comprendre et que certain d'entre vous pourrons m'aider.

    Sincères salutations

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    386
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 386
    Points : 275
    Points
    275
    Par défaut
    A mon avis essaye avec une regexp du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE cp_magasin REGEXP "^02*";
    le ^ sert à préciser que tu veux que ta selection commence par 02

  10. #10
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    et pourquoi tu n'utilises pas tout simplement substr (ou substring selon le sgbd) sur les 2 premiers caractères ?

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour vos réponses,

    Alors j'ai essayé la méthode à kahya mais soit je n'ai pas mis la bonne syntaxe soit je sais pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "SELECT * 
    FROM magasin LEFT OUTER JOIN enseigne ON num_enseigne=id_enseigne
    WHERE cp_magasin REGEXP ^'$dept%' 
    AND afficher_carte=1";
    J'ai essayé en mettant le chapeua "^" entre le guillemets, devant, avec le % après et sans le poucentage, avec l'etoile et sans etc....

    parfois rien du tout à l'ecran ( aucun revendeur )
    parfois comme avant
    parfois des gros message d'erreur

    Bref je ne vois pas et je vais maintenant essayer la méthode à Mathusalem mais si tu pouvais me donner un exemple de la syntaxe à respecter.

    Merci pour votre aide.

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 901
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    REGEXP n'existe pas en SQL, c'est une commande LINUX que l'on trouve rarement dans les SGBDR. La norme SQL (car le langage SQL est une norme) admet le prédicats SIMILAR.

    Essayez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT * 
    FROM   magasin
           LEFT OUTER JOIN enseigne 
                ON num_enseigne = id_enseigne
    WHERE CAST(SUBSTRING(cp_magasin, 1, 2) AS INTEGER) 
        = CAST('$dept' AS INTEGER)
    AND afficher_carte = 1
    ou à la norme SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT * 
    FROM   magasin
           LEFT OUTER JOIN enseigne 
                ON num_enseigne = id_enseigne
    WHERE CAST(SUBSTRING(cp_magasin FROM 1 FOR 2) AS INTEGER) 
        = CAST('$dept' AS INTEGER)
    AND afficher_carte = 1
    A +

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    386
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 386
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par SQLpro
    REGEXP n'existe pas en SQL,

    je l'utilise dans une requete, et ça marche plutot bien
    http://dev.mysql.com/doc/refman/5.0/fr/regexp.html
    http://ecole-doctorale-cbs2.igh.cnrs...apides_SQL.pdf
    J'ai du louper un épisode

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 901
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    MySQL n'a pas grand chose à voir avec SQL !

    SQL est un langage normalisé par l'ISO et mySQL un produit commercial qui utilise un peu de SQL et beaucoup d'imbécilité propre à l'entreprise MySQL AB au lieu de se conformer à la norme.

    Ce qui fait que Peter Gulutzan doit avoir beaucoup de travail à rectifier tout ce fatras depuis quelques années, car il a été embauché pour tenter de faire de MySQL quelque chose qui respecte la norme SQL

    Enfin, sachez que ce forum est consacré au langage SQL et non à MySQL. pour cela il existe un autre forum.

    Bref, commencez par apprendre le langage SQL. Mon site web, comme mes bouquins peuvent vous y aider !

    A +

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    386
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 386
    Points : 275
    Points
    275
    Par défaut
    Y'a pas que mysql.... enfin bref....

  16. #16
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 901
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    kahya : je l'utilise dans une requete, et ça marche plutot bien
    je ne sais pas par quel prof a été faite votre document :
    http://ecole-doctorale-cbs2.igh.cnrs...apides_SQL.pdf
    mais il est triffé de choses qui n'ont rien à voir avec le langage SQL.

    voici, simplement sur la première page les erreurs de ce doc :

    % modulo => FAUX la fonction modulo existe bien depuis SQL:1999 et se nomme MOD
    ! négation => FAUX la négation c'est NOT
    || ou => FAUX le ou c'est OR
    && et => FAUX le et c'est AND
    La norme SQL n'a définit aucun opérateur pour les données de type binary et varbinary et considère ces types SQL comme obsolète dans les normes les plus récentes.

    |, &, >>, << n'existent pas plus dans SQL.

    Bref en une seule première page du doc de votre école sur 16 affirmations 8 erreurs. C'est navrant et scandaleux de faire apprendre de telle imbécilités en faisant croire qu'il s'agit du langage SQL. Le prof qui a écrit de telle sornettes est visiblement incompétent hélas.

    Ne le prenez pas mal, mais j'enseigne les bases de données dans différents instituts (Orsys, Learning Tree par exemple) et écoles (Arts & Métiers, Isen), et je dois avouer que le niveau de certains prof est lamentable...

    D'ou l'écriture de mes livres sur SQL pour rectifier les idioties de cours nullissimes que l'on trouve partout sur Internet !

    A +

  17. #17
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour;

    alors la vous m'en apprenez une belle, mon ancien prof d'info nous ayans toujours dit que MySQL est identique à SQL mais en allégé et surtout gratuit d'utilisation

    Bref je vous remercie pour ces requettes toutes prete j'ai essayé vite fait avant midi mais maintenant j'ai un message d'erreur:

    le voic ( pour la seconde proposition)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in d:\www\novicase.com\htdocs\getDistributeurs.php on line 15
    Aucun distributeur recencé.
    Si vous êtes distributeur ou artisan contactez nous.
    Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in d:\www\novicase.com\htdocs\getDistributeurs.php on line 18
     
    Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in d:\www\novicase.com\htdocs\getDistributeurs.php on line 25
    Je prendrais un peu plus de temps cette après midi pour réessayer la chose.


    Merci

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    386
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 386
    Points : 275
    Points
    275
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    supplied argument IS NOT a valid MySQL result resource
    Ca veut tjs dire que ta requete est fausse... Ce que je fais moi c'est que je teste directement sur le SGBD (donc ici MySQL apparament?), sans passer par le langage en général il te donne un message plus parlant.
    Je suppose que tu a phpMyAdmin donc à tester la dedant

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bon je vais prendre 1/2 heure sur le temps de taf (après tout c'est pour le boulot) et je vais tester cela directement sur le serveur mySQL.

    Je vous tiens au courant.

    Merci

  20. #20
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Alors voila après avoir tester la première requete directement sur le serveur:

    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
     
    requête SQL: 
     
    SELECT * 
    FROM magasin
    LEFT OUTER JOIN enseigne ON num_enseigne = id_enseigne
    WHERE CAST( SUBBSTRING( cp_magasin, 1, 2
    ) AS INTEGER ) = CAST( 02 AS INTEGER ) 
    AND afficher_carte =1
     
     
    LIMIT 0 , 30 
    MySQL a répondu: 
     
    #1064 - Erreur de syntaxe pr�s de 
    '( cp_magasin , 1 , 2 ) AS INTEGER ) = CAST( 02 AS INTEGER )  
    AND' � la ligne 1
    ET maintenant pour la seconde:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT * 
    FROM magasin
    LEFT OUTER JOIN enseigne ON num_enseigne = id_enseigne
    WHERE CAST( SUBSTRING( cp_magasin
    FROM 1 
    FOR 2 ) AS INTEGER ) = CAST( 02 AS INTEGER ) 
    AND afficher_carte = 1
     
    MySQL a répondu: 
     
    #1064 - Erreur de syntaxe pr�s de 'INTEGER) 
        = CAST('02' AS INTEGER)
    AND afficher_carte = '1'' � la ligne 5
    J'ai essayé en mettant le 1 ( pour afficher carte = 1 ) entre guillemet et aussi pour le 02 qui en temps normal doit correspondre à une variable PHP.

    Je ne vois pas d'ou viens l'erreur de syntaxe.

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/09/2010, 10h48
  2. Réponses: 4
    Dernier message: 03/07/2009, 09h45
  3. [MySQL] Faire une recherche sur tous les champ commencant par ..
    Par bullrot dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 31/10/2008, 11h45
  4. Réponses: 2
    Dernier message: 14/06/2006, 09h30
  5. Probleme lors d'une recherche sur les forums
    Par JUSTIN Loïc dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 8
    Dernier message: 27/07/2005, 12h22

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