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 :

Requêtes sur un nombre indéterminé d'entrées


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Points : 75
    Points
    75
    Par défaut Requêtes sur un nombre indéterminé d'entrées
    Bonjour

    Je dois faire plusieurs requêtes simples, chacune renvoyant les données d'une seule entrée, mais sur un nombre indéterminé d'entrées.

    La première chose est que je suppose qu'il est préférable de faire une seule requête en passant les clés des entrées dans un tableau, plutôt que plusieurs requêtes depuis une boucle php ...

    Donc quelque chose comme (en théorie) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $arr = array($key1.'%', $key2.'%', ..);
    $req = $bdd->prepare('SELECT * FROM table WHERE key LIKE ? OR key LIKE ? ..');
    La deuxième chose est que je dois faire deux tests par entrée donc (toujours en théorie) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $arr = array($key1A.'%', $key1B.'%', $key2A.'%', $key2B.'%'..);
    $req = $bdd->prepare('SELECT * FROM table WHERE (keyA LIKE ? AND keyB LIKE ?) OR (keyA LIKE ? AND keyB LIKE ?)');
    C'est la raison pour laquelle je n'ai pas écrit 'IN', il faut que la correspondance soit stricte (keyA ET keyB doivent correspondre)...

    Quelle serait la syntaxe pour ce genre de requête ?

    Enfin la troisième chose est que je dois récupérer le résultat dans l'ordre initial ($key1.'%', $key2.'%', ..) ? Avec OR ça n'est pas forcément le cas..

    Merci d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonsoir,
    Quel est le format de la colonne key ?

    Ne vous est-il pas possible de faire :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT ...
    FROM ...
    WHERE key IN (keyA, keyB, ...);

    Pour la seconde requête, la même chose avec un AND :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT ...
    FROM ...
    WHERE keyA IN(key1, key2, ...) AND keyB IN(key1, key2, ...);

    Quelles sont exactement les données stockées à la fois dans le tableau $arr ? Les données des colonnes key, keyA ,keyB, key1, ... ?
    une réponse vous a permis d'avancer ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Points : 75
    Points
    75
    Par défaut
    Bonsoir

    Effectivement il est logique d'utiliser IN et votre requête est la bonne (seule la deuxième m'intéresse).

    Les paramètres 'key' sont tous les deux des char(), ils s'agit de noms de villes et de code postaux (en provenance de Geonames) et les codes postaux sont bien des chaines.

    Maintenant mon problème est de passer de ça (qui fonctionne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $req = $db->prepare('SELECT * FROM fr WHERE CPOST IN ("75000","69000") AND VILLE IN ("Paris","Lyon")');
    $req->execute();
    ...
    à une requête qui accepte des variables ....

    J'ai préparé 2 tableaux $cod et $nom, et essayé de reproduire les syntaxe de cette discussion (avec join(',',$cod)) mais ça n'a pas marché.
    Pour commencer je ne sais pas si il vaut mieux passer par ce genre de bidouillage de ' et de " ... ou par un passage de tableau avec $req->execute($arr); en utilisant des arguments '?'.

    Merci pour votre réponse en tous cas.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Points : 75
    Points
    75
    Par défaut
    Ok il y a une syntaxe qui fonctionne avec les strings dans la discussion que j'ai mis en lien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach($cod as $in) {
        $new[] = '\''.$in.'\'';
    }
    $cod = implode(',',$new);
    $req = $db->prepare("SELECT * FROM fr WHERE CPOST IN($cod)");
    Par contre elle consiste à écrire directement la variable dans la requête et j'ai lu que ce n'était pas conseillé (?).

    Maintenant il reste le problème de l'ordre des items qui n'est pas forcément respecté (ils sont renvoyés dans l'ordre des entrées dans la bdd).
    Est ce qu'un ORDER est possible en référence au tableau $cod dans la requête SQL ?

    Merci par avance

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Points : 75
    Points
    75
    Par défaut
    J'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = $db->prepare("SELECT * FROM fr WHERE CPOST IN($cod) AND VILLE IN ($nom) ORDER BY field(CPOST, $cod)");
    Avec traitement précédent sur les tableaux $cod et $nom.

    Dernière question : vaut-il mieux passer les variables dans un tableau avec arguments (:arg) ou laisser les variables dans la requête ?

Discussions similaires

  1. [AC-2010] Requête sur le nombre colis
    Par Bateman_ dans le forum Access
    Réponses: 2
    Dernier message: 30/10/2012, 14h15
  2. Réponses: 9
    Dernier message: 09/05/2009, 17h34
  3. Réponses: 1
    Dernier message: 25/04/2009, 11h31
  4. requête sur un nombre de caractère
    Par sousleau12 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 19/02/2009, 23h29
  5. [Requête]Problèmes de nombre d'enregistrements entre deux requêtes
    Par Paul Gasser dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 23/03/2007, 12h20

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