Wordpress SQL - categoria di post e tag

Sep 02 2020

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

1 O.Jones Sep 02 2020 at 02:16

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
2 Atif Sep 02 2020 at 01:49

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.