Wordpress SQL - categoria di post e tag
Ho usato questa query per ricevere post con la sua categoria e i tag.
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
È da Wordpress SQL: ottieni la categoria e i tag dei post
Ma ho un problema, la query ignora i post senza tag . Ho provato molte altre query ma non ha avuto successo. Qualcuno può aiutarmi?
Risposte
Sei molto vicino a una buona soluzione al tuo problema.
Un altro risponditore ha menzionato questo: Usa LEFT JOIN. Perché? L'interno ordinario JOINsopprime le righe della prima tabella che non corrispondono alle righe della seconda tabella.
Il tuo codice mostra anche segni di un uso improprio della famigerata estensione di MySQL a GROUP BY . Se dici
SELECT id, name, value
FROM tbl
GROUP BY id, name
in realtà stai dicendo
SELECT id, name, ANY_VALUE(value)
FROM tbl
GROUP BY id, name
In altre parole, il server sceglie ciò valueche vuole all'interno del gruppo. È necessario utilizzare un risultato aggregato prevedibile come MAX(value)o GROUP_CONCAT(value). La versione 8 di MySQL e altre marche e modelli di server di tabelle SQL rifiutano la sintassi utilizzata.
Suggerimento professionale per il bene della tua sanità mentale, non utilizzare i backtick intorno ai nomi di tabelle o colonne a meno che non siano parole riservate in SQL. E, suggerimento Pro , non utilizzare parole riservate per i nomi di tabelle o colonne.
Utilizza invece questa query.
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
Tutti i tuoi join sono inner join, quindi se i dati non corrispondono in nessuna delle tabelle, tali dati non verranno recuperati.
Cambia i tuoi join interni in join esterni sinistro / destro.