1. 程式人生 > >在Mybatis中使用連表查詢的一次實際應用

在Mybatis中使用連表查詢的一次實際應用

多表關聯 del 應用 行記錄 全部 業務 val 一定的 att

以前在工作中很少使用多表關聯查詢,對連表查詢的具體作用和使用場景也沒有很直觀的認識,通過這次在項目中的實際應用,對此有了一定的認識,特記錄如下。

關聯表介紹:

分別是屬性表attr_info、屬性值表attr_val_info、商品sku信息表sku_info、商品sku所屬的屬性信息表sku_attr_info。

attr_info表:存儲屬性大類信息,如顏色、配置、網絡

attr_val_info表:存儲屬性的具體值,如顏色-黃色、配置-128G、網絡-移動、聯通

sku_info表:存儲sku的基礎信息

sku_attr_info:存儲sku對應的屬性及屬性值信息

技術分享圖片

業務場景一:

查詢出每個sku所對應的屬性名稱及屬性值名稱

SELECT DISTINCT
	sai.product_id AS product_id,
	sai.attr_id AS attr_id,
	ai. attr_name,
	sai.attr_val_id AS attr_val_id,
	sai.attr_val_name AS attr_val_name
FROM
	attr_info ai
JOIN attr_val_info avi ON ai.attr_id = avi.attr_id
JOIN sku_attr_info sai ON (
	sai.product_id = avi.product_id
	AND sai.attr_val_id = avi.attr_val_id
)

  

將這三張表中的記錄在業務代碼中全部查詢出來,然後在代碼中編寫拆裝拼接邏輯到一個model中,這樣費時費力不好把握各個表之間的關聯關系而且邏輯不清晰,很容易出錯。

連表查詢就相當於將表記錄之間的關聯邏輯由代碼層面,遷移至數據庫層面,在數據庫中通過關聯查詢語句查找到滿足關聯條件的數據集合,在業務代碼中只需要對此查詢集合進行where條件查詢即可。

業務場景二:

在原有的sku_attr_info表中,一個sku的屬性信息對應一行記錄,每個sku包含多個屬性,即多行記錄,現在想查詢出sku所對應的顏色id和配置id以及其他的sku的屬性,用一行顯示。

SELECT
	si.product_id,
	si.sku_id,
	si.sku_url,
	sai.color_id,
	sai.spec_id
FROM
	sku_info si
JOIN (
	SELECT
		sku_id,
		MAX(
			CASE attr_id
			WHEN 1 THEN
				attr_val_id
			ELSE
				0
			END
		) color_id,
		MAX(
			CASE attr_id
			WHEN 2 THEN
				attr_val_id
			ELSE
				0
			END
		) spec_id
	FROM
		sku_attr_info
	GROUP BY
		sku_id
) sai ON (
	si.sku_id = sai.sku_id
);

  

在Mybatis中使用連表查詢的一次實際應用