Jointure requête

Petit nouveau ! | 2 Messages

31 mai 2017, 08:51

Bonjour,

j'ai besoin d'aide concernant une requête. Pour le moment je l'ai faite en deux temps, le premier consiste à aller chercher chaque catégorie avec le nom de la catégorie, et la seconde requête permet d'aller chercher toutes les recettes liées à chaque catégories.
Je pense qu'il est possible de créer seulement une requête à partir de ces deux pour obtenir le même résultat, mais bien sure je n'y arrive pas.

Code : Tout sélectionner

SELECT name, wp_terms.term_id, term_taxonomy_id, count FROM wp_term_taxonomy, wp_terms WHERE wp_term_taxonomy.taxonomy = 'product_cat' AND wp_terms.term_id = wp_term_taxonomy.term_id
Récupération de : $ID = $donnees['term_taxonomy_id'];

Et la seconde requête :

Code : Tout sélectionner

SELECT post_title,ID FROM wp_term_relationships, wp_posts WHERE wp_term_relationships.term_taxonomy_id = $ID AND wp_posts.ID = wp_term_relationships.object_id ORDER BY wp_posts.post_date DESC
Avec cette dernière requète je récupère "post_title" qui est le titre des recettes.

Merci par avance de votre aide

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

11 juin 2017, 15:31

salut,

il faut une relation entre les deux requêtes or la il n'y a pas.
tu peux modifier ton code pour utiliser du SQL plus classique afin de rendre plus clair la lecture (en clair supprimer la condition de jointure du prédicat en utilisant le mot clef join)
cela donne :
SELECT
  name,
  wp_terms.term_id,
  term_taxonomy_id
FROM wp_term_taxonomy
  JOIN wp_terms USING (.term_id)
WHERE wp_term_taxonomy.taxonomy = 'product_cat';

SELECT
  post_title,
  ID
FROM wp_term_relationships
  JOIN wp_posts ON wp_posts.ID = wp_term_relationships.object_id
WHERE wp_term_relationships.term_taxonomy_id = $ID
ORDER BY wp_posts.post_date DESC
J'ai supprimer le count de la première requête vu qu'il sert pas à grand chose.

pour le reste je suis parti du modèle de base de données suivant https://codex.wordpress.org/images/2/25/WP4.4.2-ERD.png

De manière générale on commence par écrire la requête à partir des données qui nous intéresse (ici ce qu'il à dans wp_post)
donc
select post_title,  wp_posts.ID from wp_posts
ensuite on fait les jointures avec les tables adjacentes.
la première c'est wp_term_relationships
SELECT
  post_title,
  wp_posts.ID
FROM wp_posts
  JOIN wp_term_relationships wptr ON wp_posts.ID = wptr.object_id
et ainsi de suite en utilisant les clefs étrangères.
ainsi tu auras les données que tu souhaites complété avec les données des autres tables. Dans l'autres sens tu risques d'avoir des produits cartésien entres les tables et un jeux de données conséquent et inutile.

La requête finale.
SELECT
  post_title,
  wp_posts.ID
# ajoute les autres colonnes utile

FROM wp_posts
  JOIN wp_term_relationships wptr ON wp_posts.ID = wptr.object_id
  JOIN wp_term_taxonomy wptt ON wptt.term_taxonomy_id = wptr.term_id
  JOIN wp_terms USING (term_id)

WHERE wptt.taxonomy = 'product_cat'
      AND wptr.term_taxonomy_id = $ID
la dernière jointure utilise le mot clef using, qui est un raccourci pour le on lorsque les colonnes sont identique dans les deux tables. Par contre cela impose de ne pas préfixer le nom de la colonne, du coup il y a surement un problème avec la ligne précédente . dans ce cas la dernière ligne doit être JOIN wp_terms on wptt.term_id = wp_terms.term_id

pour le count, généralement c'est utiliser avec un group by.
si tu veux le nombre total de résultat peux être que ton driver te permet d'avoir l'info.
sinon tu peux un simple
SELECT count(1) as nb
FROM wp_posts
  JOIN wp_term_relationships wptr ON wp_posts.ID = wptr.object_id
  JOIN wp_term_taxonomy wptt ON wptt.term_taxonomy_id = wptr.term_id
  JOIN wp_terms on wptt.term_id = wp_terms.term_id
WHERE wptt.taxonomy = 'product_cat'
      AND wptr.term_taxonomy_id = $ID
pour avoir l'info.

@+
Il en faut peu pour être heureux ......