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

MySQL Discussion :

Requête MySQL possible?


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut Requête MySQL possible?
    Bonjour,

    Je voudrai faire une requête MySQL du type :

    SELECT * FROM matable WHERE fonctionQuiAjouteDesTirets(monChamp)='le-texte-modifie-par-ma-fonction'"

    Ma question porte sur la fonction que je souhaite appliquer sur mon champ de la base : Est-ce que c'est possible ?
    Et dans ce cas, quel est la syntaxe à utiliser?

    Merci

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par défaut
    utilise la fonction sql replace et hop

    https://dev.mysql.com/doc/refman/5.0/en/replace.html

  3. #3
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    utilise la fonction sql replace et hop
    Merci mais ce n'était qu'un exemple : ma fonction fait plus que simplement ajouter des tirets en fait

  4. #4
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 308
    Billets dans le blog
    15
    Par défaut


    Citation Envoyé par ddami1 Voir le message
    Merci mais ce n'était qu'un exemple : ma fonction fait plus que simplement ajouter des tirets en fait
    Je pense qu’il vous faudra être plus précis sur votre question afin que les membres puissent comprendre et vous aider à résoudre le problème. Sans cela, il nous sera difficile de nous prononcer.

    Amicalement

    Malick
    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc..
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  5. #5
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 485
    Par défaut
    Est ce qu'un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM (SELECT *, fonctionQuiAjouteDesTirets(monChamp) as nouveauChamp FROM matable) WHERE nouveauChamp='le-texte-modifie-par-ma-fonction'
    ne résoudrait pas ton problème ?

    Un double select imbriqué n'est pas très optimal, mais si ton traitement est occasionnel, cela ne devrait pas te poser problème.

  6. #6
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut
    Citation Envoyé par Laurent 1973 Voir le message
    Est ce qu'un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM (SELECT *, fonctionQuiAjouteDesTirets(monChamp) as nouveauChamp FROM matable) WHERE nouveauChamp='le-texte-modifie-par-ma-fonction'
    ne résoudrait pas ton problème ?

    Un double select imbriqué n'est pas très optimal, mais si ton traitement est occasionnel, cela ne devrait pas te poser problème.
    Merci pour ta réponse Laurent, mais cela ne fonctionne pas :
    Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /datas/.......

  7. #7
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut
    Citation Envoyé par milkoseck Voir le message




    Je pense qu’il vous faudra être plus précis sur votre question afin que les membres puissent comprendre et vous aider à résoudre le problème. Sans cela, il nous sera difficile de nous prononcer.

    Amicalement

    Malick
    Bonjour Malik, je vais tenter d'expliquer ma problématique plus en détail :

    Je souhaite comparer/sélectionner un champ de ma base de donnée (un titre) avec une valeur qui est passée en paramètre d'URL et que je récupère avec $_GET.
    Jusque là, tout va bien.

    Sauf que sur ce paramètre d'URL, une fonction a été appliquée pour supprimer tous les espaces, les caractères spéciaux et les accents, et passer le tout en minuscule.

    Cela me revient donc par exemple à comparer "La valeur de mon titre" à "la-valeur-de-mon-titre" = pas de résultat bien sûr.

    Je souhaiterai donc appliquer également ma fonction au premier champ à comparer. Mais je ne sais pas s'il existe une solution.

    Une idée?

  8. #8
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Salut ddami1 .

    Ce que vous essayer de faire, c'est ni plus ni moins qu'une usine à gaz.

    Une solution basique qui me vient en lisant votre premier message serait de ne pas ajouter des tirets dans la partie gauche de l'égalité, mais de remplacer vos tirets pas des espaces dans la partie droite de l'égalité.
    Autrement dit, c'est en PHP que vous devez faire cette substitution.

    Si vous utilisez une fonction sur une colonne de la table et que celle-ci est indexée, votre recherche va se dégrader car MySql ne tiendra plus compte de cet indexe.
    Donc la solution que vous proposez n'est pas la bonne.
    Pour ne pas dégrader les performances de MySql, ce qui est vivement conseillé de faire c'est :
    --> where nom_de_colonne = 'chaine';
    ou
    --> where nom_de_colonne like 'chaine%';

    Il existe des fonctions comme 'lower' pour tout mettre en minuscule, 'upper' pour tout mettre en majuscule, 'replace' pour substituer une chaîne par une autre ...
    Mais ce n'est pas la solution car c'est trop long à écrire, pas adapté à ce que vous voulez faire, et vous aurez des problèmes de performances.

    Le mieux est de procéder à une convention et à s'y tenir dans MySql, au moment du remplissage de vos tables dans MySql.
    Si vous ne désirez pas d'accents, et bien n'en mettez pas. Idem pour les espaces et les majuscules.
    Ainsi de part et d'autre de l'égalité, lors de votre traitement de recherche, vous aurez la même convention et votre problème sera résolu.

    En fait, ce que vous faites, c'est prendre votre problème à l'envers.
    Vous stockez des chaînes de caractères directement dans votre table sans vous posez de questions.
    Puis quand le traitement arrive, là, vous constatez que vous êtes dans une usine à gaz sans solution.

    C'est au moment de la conception de votre base que vous auriez dû réfléchir sur une possible solution.
    Comment je vous l'indique, vous devez proposer une convention au moment du stockage de vos chaîne de caractères dans votre table.

    @+

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par défaut
    Voir aussi du coté de la recherche plein texte, cf. cet article : http://omiossec.developpez.com/mysql/fulltext/

  10. #10
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut ddami1 .

    Ce que vous essayer de faire, c'est ni plus ni moins qu'une usine à gaz.

    Une solution basique qui me vient en lisant votre premier message serait de ne pas ajouter des tirets dans la partie gauche de l'égalité, mais de remplacer vos tirets pas des espaces dans la partie droite de l'égalité.
    Autrement dit, c'est en PHP que vous devez faire cette substitution.

    Si vous utilisez une fonction sur une colonne de la table et que celle-ci est indexée, votre recherche va se dégrader car MySql ne tiendra plus compte de cet indexe.
    Donc la solution que vous proposez n'est pas la bonne.
    Pour ne pas dégrader les performances de MySql, ce qui est vivement conseillé de faire c'est :
    --> where nom_de_colonne = 'chaine';
    ou
    --> where nom_de_colonne like 'chaine%';

    Il existe des fonctions comme 'lower' pour tout mettre en minuscule, 'upper' pour tout mettre en majuscule, 'replace' pour substituer une chaîne par une autre ...
    Mais ce n'est pas la solution car c'est trop long à écrire, pas adapté à ce que vous voulez faire, et vous aurez des problèmes de performances.

    Le mieux est de procéder à une convention et à s'y tenir dans MySql, au moment du remplissage de vos tables dans MySql.
    Si vous ne désirez pas d'accents, et bien n'en mettez pas. Idem pour les espaces et les majuscules.
    Ainsi de part et d'autre de l'égalité, lors de votre traitement de recherche, vous aurez la même convention et votre problème sera résolu.

    En fait, ce que vous faites, c'est prendre votre problème à l'envers.
    Vous stockez des chaînes de caractères directement dans votre table sans vous posez de questions.
    Puis quand le traitement arrive, là, vous constatez que vous êtes dans une usine à gaz sans solution.

    C'est au moment de la conception de votre base que vous auriez dû réfléchir sur une possible solution.
    Comment je vous l'indique, vous devez proposer une convention au moment du stockage de vos chaîne de caractères dans votre table.

    @+
    Bonjour,

    Tu as raison, j'ai voulu faire trop compliqué avec cette requête.
    Je vais me contenter d'une requête sur un id

    Merci d'avoir donné ton avis, au moins je sais vers où me diriger maintenant

Discussions similaires

  1. Requète MySQL >> Postgresql
    Par genova dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2005, 09h05
  2. Requête MYSQL LIKE particulière
    Par TheDarkLewis dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/12/2004, 15h50
  3. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11
  4. surcharge de requête MySQL
    Par simoryl dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/06/2004, 10h43
  5. requête mysql sous php
    Par remi59 dans le forum Débuter
    Réponses: 9
    Dernier message: 03/07/2003, 10h39

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