Wordpress SQL - โพสต์หมวดหมู่และแท็ก

Sep 02 2020

ฉันใช้ข้อความค้นหานี้เพื่อรับโพสต์ที่มีหมวดหมู่และแท็กของเขา

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

มาจากWordpress SQL: รับหมวดหมู่โพสต์และแท็ก

แต่ผมมีปัญหาแบบสอบถามละเว้นการโพสต์โดยไม่ต้องแท็ก ฉันลองใช้แบบสอบถามอื่น ๆ มากมาย แต่ไม่มีคำตอบ ใครสามารถช่วยฉัน?

คำตอบ

1 O.Jones Sep 02 2020 at 02:16

คุณอยู่ใกล้ทางออกที่ดีสำหรับปัญหาของคุณแล้ว

ตอบอีกที่กล่าวถึงนี้: LEFT JOINการใช้ ทำไม? ด้านในธรรมดาจะJOINยับยั้งแถวจากตารางแรกที่ไม่ตรงกับแถวจากตารางที่สอง

รหัสของคุณยังไม่แสดงอาการของ misusing ขยายฉาวโฉ่ของ MySQL เพื่อจัดกลุ่มตาม ถ้าคุณพูด

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

คุณกำลังพูดจริง

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

กล่าวอีกนัยหนึ่งเซิร์ฟเวอร์จะเลือกสิ่งที่valueต้องการจากภายในกลุ่ม คุณควรใช้ผลรวมที่คาดการณ์เหมือนหรือMAX(value) GROUP_CONCAT(value)MySQL เวอร์ชัน 8 และยี่ห้อและรุ่นอื่น ๆ ของเซิร์ฟเวอร์ตาราง SQL ปฏิเสธไวยากรณ์ที่คุณใช้

เคล็ดลับสำหรับมืออาชีพเพื่อความมีสติของคุณอย่าใช้ backticks รอบ ๆ ชื่อตารางหรือคอลัมน์เว้นแต่จะเป็นคำสงวนใน SQL และเคล็ดลับ Proห้ามใช้คำสงวนสำหรับชื่อตารางหรือคอลัมน์

ใช้แบบสอบถามนี้แทน

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

การรวมทั้งหมดของคุณเป็นการรวมภายในดังนั้นหากข้อมูลไม่ตรงกันในตารางใดตารางหนึ่งข้อมูลนั้นจะไม่ถูกดึงมา

เปลี่ยนการรวมภายในของคุณเป็นการรวมด้านนอกซ้าย / ขวา