mysql關聯外來鍵查詢
商品表和圖片表是分開的,用一張商品圖片表關聯起來了。
查詢商品表所有欄位和圖片資訊。其餘的,商人id、區域id、分類id都是直接關聯,沒有中間表
SELECT
p.id,
p.name,
p.price,
p.unit,
f.file,
p.description,
p.is_on_sale,
p.is_reviewed,
a.name AS area_name,
u.name AS user_name,
pc.name AS category_name,
p.created_at,
p.updated_at
FROM
product_product p
LEFT JOIN product_product_image pi ON p.id = pi.product_id
LEFT JOIN backstage_file f ON pi.file_id = f.id
JOIN location_area a ON p.area_id = a.id
JOIN user_user u ON p.merchant_id = u.id
JOIN product_productcategory pc ON p.category_id = pc.id;
join預設是內連線(INNER JOIN),只有左右兩個表都有這個資料時,才會被查出來,由於有一些商品沒有圖片,所以圖片相關的兩個表用左連線,不然就會出現沒有圖片就查不出來的情況。
連線方式總結:
- INNER JOIN(內連線):如果使用
INNER JOIN
,只有當兩個表中都存在匹配時,結果集才會包含這些記錄。如果任一表中沒有匹配的記錄,那麼這些記錄就不會出現在結果集中。- LEFT JOIN(左連線) 或 LEFT OUTER JOIN:當你使用
LEFT JOIN
時,結果集會包含左表(JOIN
語句中指定的第一個表)的所有記錄,即使右表中沒有匹配的記錄。對於右表中沒有匹配的記錄,結果集中這些列的值將會是 NULL。- RIGHT JOIN(右連線) 或 RIGHT OUTER JOIN:與
LEFT JOIN
相反,RIGHT JOIN
會包含右表(JOIN
語句中指定的第二個表)的所有記錄,即使左表中沒有匹配的記錄。對於左表中沒有匹配的記錄,結果集中這些列的值將會是 NULL。- FULL OUTER JOIN(全外連線):
FULL OUTER JOIN
會返回左表和右表中所有的記錄。當某側的表中沒有匹配時,另一側表中的列將以 NULL 填充。但是,需要注意的是,並非所有的資料庫系統都支援FULL OUTER JOIN
。- CROSS JOIN(交叉連線):
CROSS JOIN
會返回兩個表的笛卡爾積,即第一個表中的每一行都會與第二個表中的每一行組合。
關於左表右表:
- 在 SQL 的
JOIN
語句中,左表(left table)和右表(right table)的概念是相對於你寫的JOIN
語句的順序而言的。第一個指定的表(即在JOIN
關鍵字之前的表)被視為左表,而隨後透過JOIN
關鍵字連線的表則被視為右表。- 當你進行多表連線時,這個規則仍然適用,但需要注意的是,每個新的
JOIN
操作都會重新定義“左表”和“右表”的上下文。對於巢狀的JOIN
或多個連續的JOIN
,你可以將每個JOIN
看作是一個獨立的操作,其中左側的表是前一個JOIN
的結果(或最初的表,如果是第一個JOIN
),而右側的表是你正在連線的新表。
條件查詢:
現在實現多表關聯查詢了,下邊需要做個判斷:商家只能查詢自己的商品,管理員可以查詢所有的:
SELECT
p.id,
p.name,
p.price,
p.unit,
f.file,
p.description,
p.is_on_sale,
p.is_reviewed,
a.name AS area_name,
u.name AS user_name,
pc.name AS category_name,
p.created_at,
p.updated_at,
su.USER_ID
FROM
product_product p
LEFT JOIN product_product_image pi ON p.id = pi.product_id
LEFT JOIN backstage_file f ON pi.file_id = f.id
JOIN location_area a ON p.area_id = a.id
JOIN user_user u ON p.merchant_id = u.id
JOIN product_productcategory pc ON p.category_id = pc.id
JOIN sys_user su ON u.phone = su.TEL
WHERE
${USER_ID} IN (SELECT user_id FROM sys_user_role WHERE role_id = 'root') OR su.USER_ID = ${USER_ID};