Wordpress SQL - catégorie de publication et balises

Sep 02 2020

J'ai utilisé cette requête pour recevoir des messages avec sa catégorie et ses tags.

SELECT
    p.id,
    p.post_name,
    c.name,
    GROUP_CONCAT(t.`name`)
FROM wp_posts p
JOIN wp_term_relationships cr
    on (p.`id`=cr.`object_id`)
JOIN wp_term_taxonomy ct
    on (ct.`term_taxonomy_id`=cr.`term_taxonomy_id`
    and ct.`taxonomy`='category')
JOIN wp_terms c on
    (ct.`term_id`=c.`term_id`)
JOIN wp_term_relationships tr
    on (p.`id`=tr.`object_id`)
JOIN wp_term_taxonomy tt
    on (tt.`term_taxonomy_id`=tr.`term_taxonomy_id`
    and tt.`taxonomy`='post_tag')
JOIN wp_terms t
    on (tt.`term_id`=t.`term_id`)
GROUP BY p.id

C'est de Wordpress SQL: obtenez la catégorie et les balises de l'article

Mais j'ai un problème, la requête ignore les messages sans balises . J'ai essayé de nombreuses autres requêtes mais pas de SUCSSES. Est-ce que quelqu'un peut m'aider?

Réponses

1 O.Jones Sep 02 2020 at 02:16

Vous êtes très proche d'une bonne solution à votre problème.

Un autre répondant a mentionné ceci: Utilisez LEFT JOIN. Pourquoi? L'intérieur ordinaire JOINsupprime les lignes de la première table qui ne correspondent pas aux lignes de la deuxième table.

Votre code montre également des signes d'utilisation abusive de l'extension notoire de MySQL à GROUP BY . Si tu le dis

   SELECT id, name, value
     FROM tbl
    GROUP BY id, name

tu dis en fait

  SELECT id, name, ANY_VALUE(value)
    FROM tbl
   GROUP BY id, name

En d'autres termes, le serveur choisit ce valuequ'il veut au sein du groupe. Vous devez utiliser un résultat global prévisible comme MAX(value)ou GROUP_CONCAT(value). La version 8 de MySQL et d'autres marques et modèles de serveur de table SQL rejettent la syntaxe que vous utilisez.

Astuce de pro pour votre santé mentale, n'utilisez pas les contre-indications autour des noms de table ou de colonne à moins qu'il ne s'agisse de mots réservés en SQL. Et, conseil de pro , n'utilisez pas de mots réservés pour les noms de table ou de colonne.

Utilisez plutôt cette requête.

SELECT
    p.id,
    p.post_name,
    GROUP_CONCAT(c.name ORDER BY c.name) categories,
    GROUP_CONCAT(t.name ORDER BY t.name) tags
FROM wp_posts p
LEFT JOIN wp_term_relationships cr
    on (p.id=cr.object_id)
LEFT JOIN wp_term_taxonomy ct
    on (ct.term_taxonomy_id=cr.term_taxonomy_id
    and ct.taxonomy='category')
LEFT JOIN wp_terms c on
    (ct.term_id=c.term_id)
LEFT JOIN wp_term_relationships tr
    on (p.id=tr.object_id)
LEFT JOIN wp_term_taxonomy tt
    on (tt.term_taxonomy_id=tr.term_taxonomy_id
    and tt.taxonomy='post_tag')
LEFT JOIN wp_terms t
    on (tt.term_id=t.term_id)
GROUP BY p.id, p.post_name
2 Atif Sep 02 2020 at 01:49

Toutes vos jointures sont des jointures internes, donc si les données ne correspondent à aucune des tables, ces données ne seront pas extraites.

Changez vos jointures internes en jointures externes gauche / droite.