Aide pour finir - requete SQL avec search avec jointures

Aide pour finir - requete SQL avec search avec jointures - PHP - Programmation

Marsh Posté le 14-10-2015 à 17:38:39    

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
Reply

Marsh Posté le 14-10-2015 à 17:38:39   

Reply

Marsh Posté le 14-10-2015 à 19:41:03    

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 ...
Reply

Marsh Posté le 14-10-2015 à 20:02:49    

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

Reply

Marsh Posté le 15-10-2015 à 10:50:24    

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
Reply

Marsh Posté le 15-10-2015 à 11:05:55    

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
Reply

Marsh Posté le 15-10-2015 à 11:23:53    

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
Reply

Marsh Posté le 15-10-2015 à 11:47:24    

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.

Reply

Marsh Posté le 15-10-2015 à 12:45:13    

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
Reply

Marsh Posté le 16-10-2015 à 14:31:41    

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

Reply

Marsh Posté le 16-10-2015 à 14:37:51    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed