自聯結
如前所述,使用表格別名的主要原因之一是能在單一 SELECT 語句中不只一次引用相同的表格。下面舉一個例子。
假如你發現某件物品(其ID為 DTNTR )有問題,因此想知道生產該物品的供應商所生產的其他物品是否也存在這些問題。此查詢要求先找到
生產ID為 DTNTR 的物品的供應商,然後找出這個供應商生產的其他物品。
下面是解決此問題的一種方法:
輸入:
select prod_id,prod_name from products where vend_id = (select vend_id from products where prod_id = 'DTNTR');
#輸出:
分析:這是第一種解決方案,它使用了子查詢。內部的 SELECT 語句做
了一個簡單的檢索,傳回生產ID為 DTNTR 的物品供應商的vend_id 。此ID用於外部查詢的 WHERE 子句中,以便檢索出這個供應商生
產的所有物品。
現在來看使用聯結的相同查詢:
輸入:
select p1.prod_id,p1.prod_name from products as p1,products as p2 where p1.vend_id = p2.vend_id and p2.prod_id = 'DTNTR';
#輸出:
分析:此查詢中需要的兩個表實際上是相同的表,因此products 表在FROM 子句中出現了兩次。雖然這是完全合法的,但對 products的引用具有二義性,因為MySQL不知道你引用的是 products 表中的哪個實例。
為解決此問題,使用了表別名。 products 的第一次出現為別名 p1 ,第二次出現為別名 p2 。現在可以將這些別名用作表名。例如, SELECT 語句使用 p1 前綴明確地給出所需列的全名。如果不這樣,MySQL將傳回錯誤,因為分別存在兩個名為 prod_id 、 prod_name 的欄位。 MySQL不知道想要的是哪一個欄位(即使它們事實上是同一個欄位)。 WHERE (透過匹配 p1 中的 vend_id 和 p2 中的vend_id )首先聯結兩個表,然後按第二個表中的prod_id 過濾數據,返回所需的數據。
用自聯結而不用子查詢 自聯結通常作為外部語句用來取代從相同表中檢索資料時使用的子查詢語句。雖然最終的結果是相同的,但有時處理聯結遠比處理子查詢快得多。應該嘗試兩種方法,以確定哪一種的性能更好。
以上是mysql高階聯結-自聯結使用實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!