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 indomptable !


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 187
    Points : 50
    Points
    50
    Par défaut requete indomptable !
    voila je ne comprends pas pourquoi mon count de ma requete 1,
    me dit qu'il n'a qu'1 seul produit qui correspond a ma requete,
    alors que la requete 2 m'affiche par exemple 18 produits ???
    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
    23
    24
    25
    26
     
    $requeteWhere = '(produits.nomProduits LIKE \'%'.$mots[0].'%\' OR produits.refProduits LIKE \'%'.$mots[0].'%\' OR marque_produits.nomMarqueProduits LIKE \'%'.$mots[0].'%\')';
     
    //requete 1 :
    $reponse = $bdd->query("SELECT COUNT(*) AS nbre_entrees_total
    FROM produits
    LEFT JOIN marque_produits
    ON produits.idMarqueProduits = marque_produits.idMarqueProduits
    WHERE $requeteWhere
    AND (publierProduits = 1)
    AND (corbeilleProduits = 0)	
    GROUP BY idProduits 
    ORDER BY nomProduits
    ") or die(print_r($bdd->errorInfo())); //requete
     
    //requete 2 :
    $reponse = $bdd->query("SELECT *
    FROM produits
    LEFT JOIN marque_produits
    ON produits.idMarqueProduits = marque_produits.idMarqueProduits
    WHERE $requeteWhere
    AND (publierProduits = 1)
    AND (corbeilleProduits = 0)	
    GROUP BY idProduits 
    ORDER BY nomProduits
    ") or die(print_r($bdd->errorInfo())); //requete
    MERCI

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    C'est peut être le LIKE qui n'est pas bien formé.

    Essaie de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIKE \'%'.$mots[0].'%\'
    par :

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 187
    Points : 50
    Points
    50
    Par défaut
    apres quelques recherches perso
    je me suis permis de reformuler ma question (voir tout premier message)
    la réponse (message 2) n'est donc plus d'actualité

    n'hésitez pas a vous repencher sur celle-ci
    merci

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    1) Met le texte des requêtes entre guillemets et indente le correctement. ce sera plus facile pour gérer les apostrophes autour des valeurs textuelles, plus agréable à lire, plus facile à débugguer.

    2) Tu devrais nommer tes tables au singulier.
    C'est plus logique dans la lecture de la requête qui s'analyse pour chaque ligne de chaque table donc ici pour chaque produit et pour chaque marque.

    3) Pourquoi avoir séparé un morceau du WHERE ?

    4) Dans la première requête, tu fais un GROUP BY mais il n'y a qu'un COUNT(*) dans le SELECT. Comment sais-tu à quel produit correspond le comptage ?

    5) Dans la seconde requête, tu ranimes la guerre des étoiles ! et tu fais un GROUP BY sans fonction d'agrégation.

    Si tu veux le nombre de marques par produit, cette requête devrait te donner le résultat :
    Code PHP : 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
    $sql = "
    	SELECT p.idProduits, p.nomProduits, COUNT(*) AS nbre_entrees_total
    	FROM produits p
    	INNER JOIN marque_produits m ON p.idMarqueProduits = m.idMarqueProduits
    	WHERE 
    		(
    			p.nomProduits LIKE '%".$mots[0]."%' 
    			OR p.refProduits LIKE '%".$mots[0]."%' 
    			OR m.nomMarqueProduits LIKE '%".$mots[0]."%'
    		)
    		AND p.publierProduits = 1
    		AND p.corbeilleProduits = 0	
    	GROUP BY p.idProduits, p.nomProduits 
    	ORDER BY p.nomProduits
    ";
    $reponse = $bdd->query($sql) OR die(print_r($bdd->errorInfo()));
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 187
    Points : 50
    Points
    50
    Par défaut
    ok bien noté

    je tiens à préciser que ma requete 2 affiche bien
    les bon résultats, elle est donc juste

    donc pour ma requete 1 je veut juste compter ces résultats
    ceci me donnerai quoi comme requete

    car je ne pense pas qui ai besoin de rajouter quelque chose avant le count
    ou alors je me trompe, dans ce cas n'hésites a insister sur ce point

    encore merci

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    donc pour ma requete 1 je veut juste compter ces résultats
    Tu veux compter quoi ?

    - Les marques par produit ? => Voir ma requête.
    - Toutes les marques indépendamment des produits ? => inutile de joindre avec les produits.
    - Tous les produits indépendamment des marques ? => inutile de joindre avec les marques.

    Bref, lis la phrase en bleu de ma signature et applique son principe !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 187
    Points : 50
    Points
    50
    Par défaut
    en effet je veux compter simplement le nombre de produit

    pour ma deuxieme requete j'ai besoin de joindre aux marques, pour récupérer le nom de la marque qui n'existe que dans la table "marque_produits"

    mais c'est vrai que pour la requete 1 je n'ai pas besoin de joindre aux marques (bien vu)

    mais ca ne change pas vraiment mon pb
    à savoir , pourquoi ma requête 2 m'affiche bien les bons produits (18)
    et que ma requete 1 me compte qu'un seul produit, sachant qu'à part le count , elle sont identiques???

    merci, pour ta patience !!!

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si tu ne veux compter que les produits, tu fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT(*) AS nb_produits
    FROM produits
    En supposant bien sûr que tu n'aies pas de doublons dans les produits car cette requête comptera toutes les lignes de la table.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 187
    Points : 50
    Points
    50
    Par défaut
    je ne veux pas compter tout les produits, mais...

    sachant que que j'ai précèdement récupéré une $variable contenant par exemple le mot le mot "pomme"

    donc je veux compter tout les produits
    dans la table "produits" joint a ma table "marque_produits"
    qui contiennent
    dans les champ "p.nomProduits" le mot $variable
    OR dans p.refProduits le mot $variable
    OR dans m.nomMarqueProduits le mot $variable
    AND (publierProduits = 1)
    AND (corbeilleProduits = 0)
    et groupé par p.idProduit pour éviter les doublons

    bref ma requete 1 ... je crois
    encore merci

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    donc je veux compter tout les produits
    dans la table "produits" joint a ma table "marque_produits"
    qui contiennent
    dans les champ "p.nomProduits" le mot $variable
    OR dans p.refProduits le mot $variable
    OR dans m.nomMarqueProduits le mot $variable
    AND (publierProduits = 1)
    AND (corbeilleProduits = 0)
    Jusque là ça va.
    et groupé par p.idProduit pour éviter les doublons
    Si tu groupes par produit, tu vas compter le nombre de lignes de chaque produit.
    Cette requête devrait faire l'affaire :
    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
    $sql = "
    	SELECT COUNT(*) AS nbre_produits
    	FROM produits p
    	INNER JOIN marque_produits m ON p.idMarqueProduits = m.idMarqueProduits
    	WHERE 
    		(
    			p.nomProduits LIKE '%".$mots[0]."%' 
    			OR p.refProduits LIKE '%".$mots[0]."%' 
    			OR m.nomMarqueProduits LIKE '%".$mots[0]."%'
    		)
    		AND p.publierProduits = 1
    		AND p.corbeilleProduits = 0	
    	ORDER BY p.nomProduits
    ";
    $reponse = $bdd->query($sql) OR die(print_r($bdd->errorInfo()));
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 187
    Points : 50
    Points
    50
    Par défaut
    en effet j'ai enlevé le groupe By
    et ca marche , merci

    mais je ne comprend pas pourquoi car le groupe by est sensé regrouper les résultats qui on la meme id ensemble
    vu que j'avais dix résultats avec des 10 id différentes, ca devrai marché aurait du m'afficher 10 et non 1
    surtout que la même requete sans le count m'affiche bien tout...?????

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    mais je ne comprend pas pourquoi car le groupe by est sensé regrouper les résultats qui on la meme id ensemble
    vu que j'avais dix résultats avec des 10 id différentes, ca devrai marché aurait du m'afficher 10 et non 1
    Non, ça devait t'afficher 10 fois 1 !

    Encore une fois, GROUP BY p.idProduits va donner une ligne de résultat par idProduits et effectuera pour chaque produit les opérations figurant dans le SELECT (une ou plusieurs opérations parmi COUNT, MIN, MAX, SUM, AVG). Si tu as 10 idProduits, tu auras 10 lignes de résultat. Et si pour chaque produit tu n'as qu'une ligne dans les données d'origine, tu auras 10 fois 1 pour une opération COUNT.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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. requete avec OBCD et visual c++
    Par Anonymous dans le forum MFC
    Réponses: 12
    Dernier message: 18/11/2004, 16h15
  2. Requete requête sous sybase
    Par eddie dans le forum Sybase
    Réponses: 3
    Dernier message: 02/04/2003, 14h51
  3. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24
  4. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43
  5. [Kylix] Requetes Kylix pour postgres
    Par Miltown dans le forum EDI
    Réponses: 1
    Dernier message: 29/05/2002, 20h22

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