Wordpress SQL - โพสต์หมวดหมู่และแท็ก
ฉันใช้ข้อความค้นหานี้เพื่อรับโพสต์ที่มีหมวดหมู่และแท็กของเขา
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: รับหมวดหมู่โพสต์และแท็ก
แต่ผมมีปัญหาแบบสอบถามละเว้นการโพสต์โดยไม่ต้องแท็ก ฉันลองใช้แบบสอบถามอื่น ๆ มากมาย แต่ไม่มีคำตอบ ใครสามารถช่วยฉัน?
คำตอบ
คุณอยู่ใกล้ทางออกที่ดีสำหรับปัญหาของคุณแล้ว
ตอบอีกที่กล่าวถึงนี้: 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
การรวมทั้งหมดของคุณเป็นการรวมภายในดังนั้นหากข้อมูลไม่ตรงกันในตารางใดตารางหนึ่งข้อมูลนั้นจะไม่ถูกดึงมา
เปลี่ยนการรวมภายในของคุณเป็นการรวมด้านนอกซ้าย / ขวา