[英]Understanding this SQL LEFT JOIN (with IS NULL) example
在數據庫中,有一個名為category的表:
CREATE TABLE category(
category_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
parent INT DEFAULT NULL
);
創建它是為了創建相鄰列表模型樹。 這是當前表格內的內容:
在此示例中(您可以在底部找到源鏈接),以下sql代碼用於獲取表中的“葉子”元素,其中“葉子”元素是表中沒有其他任何行的行行在“父級”列中使用其“ category_id”。 運行以下代碼:
SELECT t1.name FROM
category AS t1 LEFT JOIN category as t2
ON t1.category_id = t2.parent
WHERE t2.category_id IS NULL;
先前的SQL代碼的結果給出了以下結果:
例如,表中沒有行在父列內部具有值為3,因此TUBE(category_id == 3)是“葉”元素。
問題:為什么該sql代碼在邏輯上給出此結果? 我很高興這樣做,因為它是我所需要的,但我無法將其背后的理由包扎起來。
示例的來源: http : //mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
每當您看到此模式時:
SELECT ...
FROM TableA
LEFT JOIN TableB ON TableA.column = TableB.column
WHERE TableB.id is null
認為:“在TableA中查找TableB中不存在的行。
您的查詢的意思是“查找沒有子級的類別”。 如果刪除WHERE
子句並向查詢中添加更多列,則更容易理解:
SELECT t1.category_id,
t1.name,
t2.name AS ChildName
FROM category AS t1
LEFT JOIN category as t2 ON t1.category_id = t2.parent
這是您的查詢中發生的事情:
category
表開始,將其別名為t1
和t2
。 從現在開始,我將參考別名。 t1
每一行,找到t2
中將該t1
行標識為其父級的所有記錄 t1
行中沒有子行,則t2.category_id
將為null t1
行 我認為如果重命名表別名會更容易看到發生了什么:
SELECT tparent.name
FROM category AS tparent
LEFT JOIN category as tchild
ON tparent.category_id = tchild.parent
WHERE tchild.category_id IS NULL;
現在可能更容易看到您要查找的是沒有子項的所有父類別名稱的列表[tchild.category_id IS NULL]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.