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

PHP & Base de données Discussion :

Nombreuses conditions dans une requête


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Par défaut Nombreuses conditions dans une requête
    Bonjour,

    Je réalise dans un script des requête de ce type. (celle-ci est un exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //preparation de la requete pour aller chercher le nombre d articles
    $sql_nb_articles = "SELECT count(id_article) as count FROM categories_articles WHERE (";
    $nb_cats = sizeof($list_all_cats);
    for ($i=0;$i<$nb_cats-1;$i++)
    //on rajoute toutes les sous-categories
    $sql_nb_articles .= "id_categorie = '$list_all_cats[$i]' or ";
    $sql_nb_articles .= "id_categorie = '$list_all_cats[$i]') ";
     
    //envoi de la requete					
    $res_nb_articles = mysql_query($sql_nb_articles) or die(mysql_error());
    La requête fonctionne très bien pour l'instant car je teste sur une base contenant 4000 articles et pas trop de catégorie et sous-categorie.

    $list_all_cats s'alimente avec une requête précédente et je me demande si en production le script marchera toujours car il risque d'y avoir une grande quantité de OR dans certain cas.

    Y'a t-il une limite de conditions dans une requête ?

    Existe t-il une meilleur methode ?

    Merci

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Une limite de conditions ?
    Je ne pense pas. Par contre la longueur de la chaîne de la requête est limitée. Tu peux la racourcir en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE id_categorie IN(123, 234, 345)
    Existe t-il une meilleur methode ?
    Sûrement.

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    Si, comme son nom semble l'indiquer, $list_all_cats contient TOUTES les catégories et que tous les articles sont affectés à une catégorie, je ne vois pas trop l'intérêt du WHERE !

    Je pense que le WHERE doit en fait être limité par la taille possible pour une requête, donc ça va dépendre plutôt de la longueur du contenu des $list_all_cats[$i].

    Trois détails :
    1) Evite d'utiliser un mot du langage SQL comme alias ou comme nom d'objet (ici COUNT).

    2) Si, comme cela devrait être le cas, id_categorie est de type entier, inutile d'encombrer la requête avec des '.

    3) Je te suggère plutôt cette méthode pour construire ta requête :
    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
    //preparation de la requete pour aller chercher le nombre d articles
    $sql_nb_articles = "SELECT COUNT(id_article) AS nb 
                FROM categories_articles 
                WHERE 1 ";
     
    $nb_cats = sizeof($list_all_cats);
     
    for ($i=0; $i<$nb_cats; $i++)
    {
        //on rajoute toutes les sous-categories
        $sql_nb_articles .= "OR id_categorie = $list_all_cats[$i]";
    }
     
    //envoi de la requete                    
    $res_nb_articles = mysql_query($sql_nb_articles) or die(mysql_error());
    EDIT : Grillé par Séb.
    Je pensais aussi au :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE id_categorie IN($liste_categories)
    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 confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE id_categorie IN(123, 234, 345)
    J'ai mis en place le IN et sa raccourci déjà bien la requête.

    Citation Envoyé par Séb. Voir le message
    Une limite de conditions ?
    Je ne pense pas. Par contre la longueur de la chaîne de la requête est limitée.
    Quelle est cette limite ?

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par yann123456 Voir le message
    Quelle est cette limite ?
    Je ne sais pas, je me souviens juste avoir déjà été confronté au pb.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Par défaut
    Si, comme son nom semble l'indiquer, $list_all_cats contient TOUTES les catégories et que tous les articles sont affectés à une catégorie, je ne vois pas trop l'intérêt du WHERE !
    $list_all_cats contient l'id de la catégorie ainsi que l'id de toutes ses sous-categories jusqu'au dernier niveau.
    Donc si c'est une catégorie principale il y a beaucoup d'id.
    En test j'ai déjà des requêtes de ce type et d'autres plus courte bien entendu
    SELECT count(id_article) as count FROM categories_articles WHERE id_categorie IN ( '1', '243', '7', '260', '109', '115', '131', '329', '225', '244', '245', '246', '247', '248', '318', '123', '124', '129', '265', '304', '331', '332', '356', '368', '369', '370', '371', '376', '387', '8', '9', '10', '11', '12', '13', '20', '21', '22', '26', '218', '231', '264', '273', '297', '313', '261', '262', '383', '408', '108', '111', '337', '338', '339', '341', '342', '344', '348', '352', '359', '364', '396', '397', '406', '268', '311', '315', '388', '389', '390', '391', '401', '402', '403', '375', '407', '330', '226', '227', '228', '266', '269', '270', '294', '309', '320', '321', '322', '351', '354', '385', '386', '125', '126', '384', '127', '232', '267', '307', '319', '324', '382', '393', '395', '405', '130', '222', '224', '317', '346', '128', '212', '241', '300', '325', '326', '381', '213', '229', '373', '374', '400', '335')
    Je pense que le WHERE doit en fait être limité par la taille possible pour une requête, donc ça va dépendre plutôt de la longueur du contenu des $list_all_cats[$i].
    Quelle est cette limite ?

    Trois détails :
    1) Evite d'utiliser un mot du langage SQL comme alias ou comme nom d'objet (ici COUNT).
    Exact

    2) Si, comme cela devrait être le cas, id_categorie est de type entier, inutile d'encombrer la requête avec des '.
    Vrai aussi

    3) Je te suggère plutôt cette méthode pour construire ta requête :
    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
    //preparation de la requete pour aller chercher le nombre d articles
    $sql_nb_articles = "SELECT COUNT(id_article) AS nb 
                FROM categories_articles 
                WHERE 1 ";
     
    $nb_cats = sizeof($list_all_cats);
     
    for ($i=0; $i<$nb_cats; $i++)
    {
        //on rajoute toutes les sous-categories
        $sql_nb_articles .= "OR id_categorie = $list_all_cats[$i]";
    }
     
    //envoi de la requete                    
    $res_nb_articles = mysql_query($sql_nb_articles) or die(mysql_error());
    A quoi sert le 1, il évite d'utiliser des parenthèses ?

    Merci de vos réponses

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par yann123456 Voir le message
    A quoi sert le 1, il évite d'utiliser des parenthèses ?
    Le 1 est juste là pour commencer la clause WHERE avec une condition toujours vraie afin de pouvoir la faire suivre par une série de OR.
    Mais comme tu as adopté le WHERE ... IN, tu n'en as plus besoin.
    Mais c'est un truc à retenir.

    Une autre méthode consiste à construire le WHERE dans une variable séparée :
    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
    21
    22
    //preparation de la requete pour aller chercher le nombre d articles
    $sql_nb_articles = "SELECT COUNT(id_article) AS nb 
                FROM categories_articles ";
     
    // Préparation du WHERE
    $where = '';
     
    $nb_cats = sizeof($list_all_cats);
     
    for ($i=0; $i<$nb_cats; $i++)
    {
        if($where != '') $where .= " OR "; 
     
        //on rajoute toutes les sous-categories
        $sql_nb_articles .= " id_categorie = $list_all_cats[$i]";
    }
     
    // Fin de construction de la requête
    $sql_nb_articles .= $where;
     
    //envoi de la requete                    
    $res_nb_articles = mysql_query($sql_nb_articles) or die(mysql_error());
    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 !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    Ton problème de requête est peut être du à un modèle de données qui n'est pas optimale.

    Ta requête permet afficher tous les articles d'une catégorie et de ses sous catégories associées ?

    As tu une table permettant de coder ton arbre ?

    Par exemple, dans ta table où sont définies tes catégories, tu pourrrais ajouter un id_categrie_mere afin d'indiquer si une catégorie donnée possède une mère.

    Ainsi, pour afficher toutes les catégories filles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select * from categorie as CAT
    where CAT.id_categorie_mere = '.$id_categorie_mere;
    Pour récupérer tous les articles d'une sous catégorie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select * from categorie_articles as ART
     
    INNER JOIN categories AS CAT
    ON CAT.id_categorie = ART.id_categorie
     
    where CAT.id_categorie_mere = '.$id_categorie_mere;
    Précises tes besoins...

    Damien

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Par défaut
    Citation Envoyé par bacchus41 Voir le message

    Précises tes besoins...

    Damien
    Bonjour,

    Merci de ta réponse.

    J'ai effectivement un champ id_categorie_mere qui est utile dans certains cas.
    Par contre dans cette requête. je dois descendre jusqu'au dernier sous-niveau.
    Donc, actuellement, je vais chercher tous les id_categories de niveau inférieur et je fais ma requête.
    Par contre le fait de travailler sur l'id categorie_mere plutôt que l'id_categorie pourrait réduire ma requête, puisque j'élimine un niveau d'office.

    Je vais réfléchir à tous cela.

  10. #10
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    S'il n'est pas trop tard pour changer ton modèle de données et puisque tu as des sous-sous-...-sous-catégories, tu peux regarder la gestion des arborescence par représentation intervallaire.
    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 !

Discussions similaires

  1. [Requête] Explication sur une condition dans une Requête
    Par jimmymatrix dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/05/2007, 14h34
  2. Condition dans une requête
    Par dimitrios dans le forum Access
    Réponses: 3
    Dernier message: 25/10/2006, 10h32
  3. Condition dans une requête croisée
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 18/10/2005, 10h31
  4. Peut on insérer une condition dans une requête ?
    Par MITCH31 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 22/09/2005, 18h26
  5. Condition dans une requête
    Par fdloisel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/08/2004, 16h55

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