teams(t_id, t_name)
result(id, h_id, g_id, result, match_time)
-- h_id: 主隊ID, g_id: 客隊ID
主隊名 | 客隊名 | 比分 | 比賽時間
SELECT t1.id, t1.h_name, t2.g_name, t1.result, t1.match_time
FROM (
SELECT r.id, t.t_name AS h_name, r.match_time, r.result
FROM result r JOIN teams t ON t.t_id = r.h_id
) t1
JOIN (
SELECT r.id, t.t_name AS g_name
FROM result r JOIN teams t ON t.t_id = r.g_id
) t2 ON t1.id = t2.id;
SELECT
r.id,
t1.t_name AS home_team,
t2.t_name AS guest_team,
r.result,
r.match_time
FROM result r
JOIN teams t1 ON r.h_id = t1.t_id
JOIN teams t2 ON r.g_id = t2.t_id;
關鍵點:teams 表連接兩次,必須起別名 t1/t2,ON 條件分別匹配主隊/客隊 ID。
subject(id, name, pid)
-- pid: 父分類ID,頂級分類 pid=0 或 NULL
父分類名 | 子分類名
SELECT
p.name AS parent_name,
c.name AS child_name
FROM subject p
JOIN subject c ON p.id = c.pid;
核心模式:同一張表起兩個別名(p/c),通過 父表.主鍵 = 子表.外鍵 關聯。可遞歸擴展至多層級:
SELECT l1.name AS l1, l2.name AS l2, l3.name AS l3
FROM subject l1
LEFT JOIN subject l2 ON l1.id = l2.pid
LEFT JOIN subject l3 ON l2.id = l3.pid
WHERE l1.pid = 0; -- 只查頂級為根的三級分類
| 類型 | 語法 | 語義 | 適用場景 |
|---|---|---|---|
| 內連接 | INNER JOIN / JOIN | 雙邊都有匹配行才返回 | 主鍵-外鍵強關聯,如訂單-用戶 |
| 左連接 | LEFT JOIN | 左表全保留,右表無匹配填 NULL | 主表帶從表,如用戶-訂單(含無訂單用戶) |
| 右連接 | RIGHT JOIN | 右表全保留,左表無匹配填 NULL | 較少用,可改寫為 LEFT JOIN |
STRAIGHT_JOIN 固定順序多表連接的核心難點在於同表多次連接時的別名管理與連接類型的語義選擇。掌握「別名區分角色、ON 條件精準匹配、LEFT JOIN 保留主表」三大原則,即可輕鬆應對隊伍對陣、無限級分類、組織架構等經典關聯查詢場景。