Wordpress SQL - gönderi kategorisi ve etiketleri

Sep 02 2020

Bu sorguyu, kategorisi ve etiketleri ile gönderileri almak için kullandım.

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

Bu dan Wordpress SQL: get sonrası kategori ve etiketleri

Ama bir sorunum var, sorgu etiketleri olmayan gönderileri yok sayıyor . Diğer birçok sorgu denedim ama BAŞARILI yok. Biri bana yardım edebilir mi?

Yanıtlar

1 O.Jones Sep 02 2020 at 02:16

Sorununuza iyi bir çözüme çok yakınsınız.

Başka bir cevaplayıcı bundan bahsetti: Kullan LEFT JOIN. Neden? Sıradan iç JOIN, ikinci tablodaki satırlarla eşleşmeyen ilk tablodaki satırları bastırır.

Kodunuz ayrıca MySQL'in kötü şöhretli GROUP BY uzantısını kötüye kullandığına dair işaretler de gösteriyor . Eğer öyle diyorsan

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

aslında diyorsun

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

Başka bir deyişle, sunucu valuegrup içinden istediğini seçer . Sen gibi öngörülebilir agrega sonucu kullanmalıdır MAX(value)veya GROUP_CONCAT(value). MySQL Sürüm 8 ve SQL tablo sunucusunun diğer marka ve modelleri kullandığınız sözdizimini reddeder.

Akıl sağlığınız için profesyonel ipucu , SQL'de ayrılmış kelimeler olmadıkça, tablo veya sütun adlarının etrafındaki ters işaretleri kullanmayın. Ve Pro ipucu , tablo veya sütun adları için ayrılmış sözcükler kullanmayın.

Bunun yerine bu sorguyu kullanın.

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

Tüm birleşimleriniz iç birleşimlerdir, bu nedenle tablodan herhangi birindeki veriler eşleşmiyorsa, bu veriler alınmayacaktır.

İç birleşimlerinizi sol / sağ dış birleşimler olarak değiştirin.