Wordpress SQL - catégorie de publication et balises
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
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
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.