SELECT id, name, last_reply, replies
FROM (
SELECT topic_id, MAX(date) AS last_reply, COUNT(*) AS replies
FROM wp_pod_tbl_forum
GROUP BY
topic_id
) r
JOIN wp_pod_tbl_forum t
ON t.topic_id = 0
AND t.id = r.topic_id
UNION ALL
SELECT id, name, date, 0
FROM wp_pod_tbl_forum t
WHERE NOT EXISTS
(
SELECT NULL
FROM wp_pod_tbl_forum r
WHERE r.topic_id = t.id
)
AND t.topic_id = 0
ORDER BY
date DESC
LIMIT 0, 20
यदि आपकी तालिका MyISAM
है या id
PRIMARY KEY
नहीं है , आपको (topic_id, id)
. पर एक समग्र ऑनडेक्स बनाना होगा ।
अगर आपकी टेबल InnoDB
है और id
एक PRIMARY KEY
है , केवल (topic_id)
. पर एक अनुक्रमणिका करेगा (id
परोक्ष रूप से अनुक्रमणिका में जोड़ दिया जाएगा)।
अपडेट करें
यह क्वेरी संभवतः और भी अधिक कुशल होगी, बशर्ते कि आपके पास (topic_id, id)
पर अनुक्रमणिका हों और (date, id)
:
प्रदर्शन विवरण के लिए मेरे ब्लॉग में यह लेख देखें:
यह क्वेरी 30 ms
. में पूरी होती है 100,000
. पर पंक्तियों का नमूना डेटा:
SELECT id, name, last_reply,
(
SELECT COUNT(*)
FROM wp_pod_tbl_forum fc
WHERE fc.topic_id = fl.topic_id
) AS replies
FROM (
SELECT topic_id, date AS last_reply
FROM wp_pod_tbl_forum fo
WHERE id = (
SELECT id
FROM wp_pod_tbl_forum fp
WHERE fp.topic_id = fo.topic_id
ORDER BY
fp.date DESC, fp.id DESC
LIMIT 1
)
AND fo.topic_id <> 0
ORDER BY
fo.date DESC, fo.id DESC
LIMIT 20
) fl
JOIN wp_pod_tbl_forum ft
ON ft.id = fl.topic_id
UNION ALL
SELECT id, name, date, 0
FROM wp_pod_tbl_forum t
WHERE NOT EXISTS
(
SELECT NULL
FROM wp_pod_tbl_forum r
WHERE r.topic_id = t.id
)
AND t.topic_id = 0
ORDER BY
last_reply DESC, id DESC
LIMIT 20
इस क्वेरी के कुशल होने के लिए दोनों अनुक्रमणिकाएँ आवश्यक हैं।
अगर आपकी टेबल InnoDB
है और id
एक PRIMARY KEY
है , तो आप indexes
. से id को हटा सकते हैं ऊपर।