環境
數據庫:MYSQL V5.7 for Linux on x86_64
使用
1、
SELECT Ta.*, Tb.* FROM Ta LEFT JOIN Tb ON Ta.FPrimaryKey = Tb.FPrimaryKey;
該查詢語句會先在`Tb`表中根據關鍵字’ON‘條件,來查詢相關條目(如果沒有找到匹配條目,將會根據查詢字段填充NULL數據)。然后把在`Tb`表中查出的結果與`Ta`整張表作笛卡爾積作為最終查詢結果。
2、如果在上述SQL語句后面接'WHERE'條件——
WHERE Ta.FPrimaryKey = 'x';
那么在上述1步驟查詢結果基礎上,根據WHERE條件篩選出相應條目;
3、如果從三張表里查詢主鍵相同的條目,最后與第四表左聯立,
CREATE TEMPORARY TABLE tmp AS ( SELECT Ta.FteKey, Tb.FKey, Tc.* FROM Ta, Tb, Tc WHERE Ta.FPrimaryKey = Tb.FPrimaryKey AND Tb.FPrimaryKey = Tc.FPrimaryKey; ); SELECT * FROM tmp LEFT JOIN Td ON tmp.FPrimaryKey = Td.FPrimaryKey;
臨時表會在當前MYSQL連接關閉后釋放掉,之后將不占用數據庫空間。
4、上述3中,`Td`表中可能沒有匹配’ON‘條件的條目,將會向查詢結果的相應字段填充NULL,結果大致如下圖所示:
圖一
此時如果通過PHP獲取查詢結果的`FPrimaryKey`字段,將取`Td`部分`FPrimaryKey`的值。
為解決這個問題,可以在上述3基礎上,使用改字段名的方法,
SELECT *, tmp.FPrimaryKey AS FTmpPrimaryKey FROM tmp LEFT JOIN Td ON tmp.FTmpPrimaryKey = Td.FPrimaryKey;
PHP取`FTmpPrimaryKey`這個字段名就好。
另外如果僅考慮以下SQL語句:
SELECT Ta.FKey, Tb.FKey, Tc.*, Td.* FROM Ta, Tb, Tc LEFT JOIN Td ON Tc.FKey = Td.FKey;
經測試,`ON`條件里只能使用`Tc`表,而不能使用Ta、Tb表,這應該跟`FROM`關鍵詞后表的順序有關。
參考:
1. https://www.cnblogs.com/zjfjava/p/6041445.html —— 【關於 MySQL LEFT JOIN 你可能需要了解的三點】