Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
901 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Aide pour finir - requete SQL avec search avec jointures

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Aide pour finir - requete SQL avec search avec jointures

n°2267737
13stephweb​13
Posté le 14-10-2015 à 17:38:39  profilanswer
 

Bonjour,
je viens ici demander un peu d'aide SVP, car je galère à finaliser une requete avec des jointures.
Mon but est de récupérer ma liste des catégories dans ma page de gestions des catégories, et aussi d'afficher à coté du Nom de chaque catégories le nombre d'articles publiés (statut 1) par catégorie.
 
Avec un search WHERE mots clés entrés pour afficher mes catégories selon mots clés entrés, je ni arrive pas.
Avec le code ci-dessous, je n'arrive pas à faire en sorte que le search cherche dans la table categories.
Actuellement, mes catégories s'affichent toutes, quelque soit les mots clés entrés...
 
Peut on m'aider Svp ?
Voici mon code :  
 

Code :
  1. <?php
  2. /*
  3. * categories : Table des catégories qui peuvent etre reliées à des articles
  4. * articles : Table des articles
  5. * categories_jointes_articles : Table pivot (qui a comme champs id_article et id_categorie)
  6. *
  7. * SQL :
  8. * _récupérer liste des catégories selon mots clés entrés dans search, et nombre d'articles par catégories :
  9. * SELECT champs de la table categories
  10. * , et COUNT le nombre de articles.id  (dans les parenthèses du count mettre (articles.id) au lieu de (*), servira à récup WHERE statut articles = 1 (publiés))
  11. * FROM table categories
  12. * JOIN table categories_jointes_articles
  13. *   sur categories.id est = à categories_jointes_articles.id_categorie
  14. *
  15. * _count nombre d'articles par catégories uniquement WHERE articles.statut = 1 (statut publiés)
  16. * JOIN table articles
  17. *   sur articles.id = à categories_jointes_articles.id_article
  18. *   AND articles.statut est = à 1   (pour afficher aussi les catégories qui ne sont pas reliées à des articles where statut = 1)
  19. */
  20. $sql = "SELECT categories.id, categories.nom
  21.     , COUNT(articles.id) as nb_articles
  22.     FROM categories
  23.     LEFT OUTER JOIN categories_jointes_articles
  24.         ON categories.id = categories_jointes_articles.id_categorie
  25.     LEFT OUTER JOIN articles
  26.         ON articles.id = categories_jointes_articles.id_article
  27.         AND ".$tablePosts.".statut = ?";
  28. $sql .= " AND categories.nom LIKE ? ";     // c'est cette ligne que je ne sais pas où mettre
  29. $sql .= " GROUP BY categories.id, categories.nom";
  30. $requete = self::getDb()->prepare($sql);
  31. $requete->bindValue(1, 1, PDO::PARAM_INT);
  32. $requete->bindValue(2, '%'.$mots.'%', PDO::PARAM_STR);
  33. $requete->execute();
  34. $requete->setFetchMode(PDO::FETCH_OBJ);
  35. return $requete;


Merci.


Message édité par 13stephweb13 le 14-10-2015 à 18:25:50
mood
Publicité
Posté le 14-10-2015 à 17:38:39  profilanswer
 

n°2267743
vttman2
Je suis Open ...
Posté le 14-10-2015 à 19:41:03  profilanswer
 

En passant ...
Je suggère d'utiliser des alias et de placer
les conditions dans la partie where, la partie join étant
pour les relations entre champs  ... ce genre
=>

Code :
  1. $sql = "SELECT c.id, c.nom
  2.     , COUNT(a.id) as nb_articles
  3.     FROM categories c
  4.     LEFT OUTER JOIN categories_jointes_articles cj
  5.         ON c.id = cj.id_categorie
  6.     LEFT OUTER JOIN articles a
  7.         ON a.id = cj.id_article";
  8. $sql .= " where c.nom LIKE ? ";   
  9. --- si statut est un champ de articles
  10. $sql .= " AND a.".$tablePosts.".statut = ?";
  11. --- ou si statut est un champ de categories_jointes_articles
  12. $sql .= " AND cj.".$tablePosts.".statut = ?";
  13. ---
  14. $sql .= " GROUP BY c.id, c.nom";


Message édité par vttman2 le 14-10-2015 à 19:42:26

---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
n°2267744
13stephweb​13
Posté le 14-10-2015 à 20:02:49  profilanswer
 

Merci du conseil. Mais ça ne résous pas mon problème.

n°2267756
kao98
...
Posté le 15-10-2015 à 10:50:24  profilanswer
 

essaye de remplacer

Code :
  1. $sql .= " AND categories.nom LIKE ? ";     // c'est cette ligne que je ne sais pas où mettre
  2. $sql .= " GROUP BY categories.id, categories.nom";
 

par

 
Code :
  1. $sql .= " GROUP BY categories.id, categories.nom";
  2. $sql .= " HAVING categories.nom LIKE ? ";     // c'est cette ligne que je ne sais pas où mettre
 

De mémoire : WHERE filtre sur l'ensemble du jeu de résultat avant regroupement. HAVING filtre après regroupement.


Message édité par kao98 le 15-10-2015 à 10:51:14

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
n°2267757
rufo
Pas me confondre avec Lycos!
Posté le 15-10-2015 à 11:05:55  profilanswer
 

ben justement, il vaut mieux mettre le filtre sur le nom de la catégorie dans le WHERE comme ça, le regroupement ira plus vide car moins d'enregistrements remontés :/
 
Bizarre que ça ne marche pas. Le SQL me semble bon. Est-ce que les paramètres sont bien envoyés par PDO à la requête ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2267759
kao98
...
Posté le 15-10-2015 à 11:23:53  profilanswer
 

rufo a écrit :

ben justement, il vaut mieux mettre le filtre sur le nom de la catégorie dans le WHERE comme ça, le regroupement ira plus vide car moins d'enregistrements remontés :/

 

Bizarre que ça ne marche pas. Le SQL me semble bon. Est-ce que les paramètres sont bien envoyés par PDO à la requête ?


Ouais, je sais bien. Mais ça peut pas faire de mal d'essayer.
Bonne remarque pour les paramètres envoyés à PDO :jap:

 

Edit : j'avais pas vu qu'il filtrait exclusivement sur la jointure. Pas bien :o
C'est peut-être ça le problème.
@"Merci du conseil. Mais ça ne résous pas mon problème.": tu as essayé au moins ?


Message édité par kao98 le 15-10-2015 à 11:27:26

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
n°2267761
Pablo Escr​obarbe
Retour d'exil
Posté le 15-10-2015 à 11:47:24  profilanswer
 

Faut mettre dans le where, vttman2 a donné la bonne réponse. Par contre les alias ne sont pas obligatoires, il peut faire comme il se sent plus confortable.

n°2267765
rufo
Pas me confondre avec Lycos!
Posté le 15-10-2015 à 12:45:13  profilanswer
 

Moi, je pense que le pb vient de cette ligne :
$requete->bindValue(2, '%'.$mots.'%', PDO::PARAM_STR);
 
La variable $mots contient quoi ? T'as fait un var_dump($mots) ? Quelque chose me dit que tu auras une surprise en trouvant une chaîne vide...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2267877
13stephweb​13
Posté le 16-10-2015 à 14:31:41  profilanswer
 

Du coup j'ai mis ceci:

Code :
  1. $sql = "SELECT categories.id, categories.nom
  2.     , COUNT(articles.id) as nb_articles
  3.     FROM categories
  4.     LEFT OUTER JOIN categories_jointes_articles
  5.         ON categories.id = categories_jointes_articles.id_categorie
  6.     LEFT OUTER JOIN articles
  7.         ON articles.id = categories_jointes_articles.id_article
  8.         AND ".$tablePosts.".statut = ?";
  9. $sql .= " WHERE categories.nom LIKE ? ";     // fallais que je mette un WHERE et non un AND


merci, sujet résolu

n°2267878
kao98
...
Posté le 16-10-2015 à 14:37:51  profilanswer
 

13stephweb13 a écrit :

Du coup j'ai mis ceci:

Code :
  1. $sql = "SELECT categories.id, categories.nom
  2.     , COUNT(articles.id) as nb_articles
  3.     FROM categories
  4.     LEFT OUTER JOIN categories_jointes_articles
  5.         ON categories.id = categories_jointes_articles.id_categorie
  6.     LEFT OUTER JOIN articles
  7.         ON articles.id = categories_jointes_articles.id_article
  8.         AND ".$tablePosts.".statut = ?";
  9. $sql .= " WHERE categories.nom LIKE ? ";     // fallais que je mette un WHERE et non un AND


merci, sujet résolu


Code :
  1. $sql = "SELECT categories.id, categories.nom
  2.    , COUNT(articles.id) as nb_articles
  3.    FROM categories
  4.    LEFT OUTER JOIN categories_jointes_articles
  5.        ON categories.id = categories_jointes_articles.id_categorie
  6.  
  7.    LEFT OUTER JOIN articles
  8.        ON articles.id = categories_jointes_articles.id_article";
  9.  
  10. $sql .= " WHERE ".$tablePosts.".statut = ?
  11.        AND categories.nom LIKE ? ";     // il n'était toujours pas au bon endroit le where


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Aide pour finir - requete SQL avec search avec jointures

 

Sujets relatifs
[SQL] [facile] selection des données de plus de 256 lignes.[java] cherche aide sur getters setters
interroger plusieurs tables en une seule requete[Résolu] [SQL Server/Cobol] Pb alim donnée dans un Insert
[Aide]Cherche une personne pour configuration JoomlaErreur SQL ( Oracle ) 00936
[SQL newbie inside] changement de nom de domaine[SQL Server / Cobol] Requête sur Varchar
[Aide] convertir balise <iframe> en <object> 
Plus de sujets relatifs à : Aide pour finir - requete SQL avec search avec jointures


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR