表結構
-- 貼子表
CREATE TABLE tiezi (
tieziid INT PRIMARY KEY IDENTITY,
userid INT, tztitle VARCHAR(20), tzcontent VARCHAR(200),
tztime DATETIME, tztop VARCHAR(1), hfnum INT
);
-- 回復表
CREATE TABLE tzpinglun (
pinglunid INT PRIMARY KEY IDENTITY,
tieziid INT, tzpluserid INT, tzplcontent VARCHAR(200),
tzpltime DATETIME, tzpltitle VARCHAR(20)
);
方案一:子查詢(推薦可讀性)
SELECT t.*,
(SELECT COUNT(*) FROM tzpinglun WHERE tieziid = t.tieziid) AS reply_count
FROM tiezi t;
方案二:LEFT JOIN + GROUP BY
SELECT t.*, COALESCE(p.cnt, 0) AS reply_count
FROM tiezi t
LEFT JOIN (
SELECT tieziid, COUNT(*) AS cnt
FROM tzpinglun
GROUP BY tieziid
) p ON t.tieziid = p.tieziid;
性能對比
- 小數據量(<1萬):子查詢執行計劃常優化為 JOIN,性能無差異。
- 大數據量:方案二物化聚合後 JOIN 更穩定,避免逐行執行子查詢。
- 若
tiezi.hfnum 字段實時維護(觸發器/應用層),可直接讀取該字段,無需 JOIN。
索引建議
CREATE INDEX IX_tzpinglun_tieziid ON tzpinglun(tieziid);