類似京東的商品篩選功能的實現,電子商城的產品篩選功能是怎麼實現的?

數據表結構
1、屬性表(attributeid ,....)
2、商品表(productid ,.....)
3、屬性值表(attributevalueId,attributeId,......)
4、商品_屬性值表(productid attributevalue)(關鍵表)

先添加商品分類,
添加商品分類後,添加該商品分類的屬性。
如添加衣服分類,該分類有顏色、尺碼屬性。
再如手機分類,該分類有品牌屬性,網絡制式屬性的。
添加分類屬性後,還有爲該屬性添加屬性值,如顏色屬性的屬性值爲:藍色,紅色,卡其,迷彩等屬性值。
先在開始添加商品,添加商品時選擇相應的分類後,若該分類下有屬性擇顯示屬性與屬性值,用戶選擇屬性值後,提交信息並在商品_屬性值表中添加以下數據。
如我選擇了顏色屬性(假設attributeid =1)下的屬性值爲藍色(attributevalueId=1)和紅色(假設attributevalueid =2),尺碼(假設attributeid =2)爲M的屬性(假設attributevalueid =3)
那麼他存入商品_屬性表表的數數據形式爲:
productid  attributevalue
1                 1_2_3
2                 1_3
不知大家理清楚了嗎?
一個商品分類有多個屬性,每個屬性下有多個屬性值,
一個商品可以選擇多個屬性值(如,藍色,紅色,M,XXL)等屬性

好了表結構就先理到這。下面開始查選了。
這裏還有有個難點就是如何拼接屬性值。
現在假設我們的篩選條件爲顏色爲藍色,尺碼的M的衣服
那麼我傳入的屬性爲1_3
首先我們先把傳入的屬性進行拆分並存入臨時表 #temp中(當然這之前要先創建好這個臨時表)
使用while循環拆分‘1_3’
set @strValue='1_3';
WHILE LEN(@strValue)>0
BEGIN
INSERT #temp SELECT LEFT(@strValue,CHARINDEX('_',@strValue+'_')-1)
INSERT test SELECT LEFT(@strValue,CHARINDEX('_',@strValue+'_')-1)
SET @strValue=LTRIM(STUFF(LTRIM(@strValue),1,CHARINDEX('_',LTRIM(@strValue)+'_'),''))
--INSERT test values( @strValue)

END


----關鍵字CHARINDEX爲返回符合一定條件的字符串所在的位置
CHARINDEX('_',@strValue+'_')此處相當於
CHARINDEX('_','1_3_') 那麼返回的應是1,
CHARINDEX('_',@strValue+'_')-1 再減1則爲0
然後用Left來竊取,竊取得到1,並插入臨時表。
然後把竊取到的部分去掉,讓@strValue=‘3_’
SET @strValue=LTRIM(STUFF(LTRIM(@strValue),1,CHARINDEX('_',LTRIM(@strValue)+'_'),''))
以此類推,最後存入臨時表的數據爲
strValue
1
3
接下來就是查找了

SELECT [ProductId]
      ,[AttributeValue]
  FROM [dbo].[Product_Attribute] where not exists(select * from test
where charindex('_'+cast(strValue as nvarchar(222))+'_' , '_'+[AttributeValue]+'_')=0)

現在來解釋這句話,
先來拆分一下吧,首先是這句的意思(strValue 爲(臨時表中的字段),AttributeValue爲產品所選擇的屬性值
select * from #tempwhere charindex('_'+strValue +'_' , '_'+[AttributeValue]+'_')=0
查找#temp表中值不在AttributeValue中的記錄,
假設AttributeValue=‘1_3_4_8’,strValue =0,則有記錄,
假設AttributeValue=‘1_3_4_8’,strValue =3,則沒有記錄,
假設AttributeValue=‘1_3_4_8’,strValue =4,則沒有記錄,
其實是這樣子的
如strValue =1,則charindex('_1_','_1_3_4_8_')
在_1_3_4_8_中能找到與_1_匹配的項嗎?找到則返回大於0的值,找不到則返回0
如果傳過來的屬性值在產品的屬性值中有不存在的項則證明該產品的屬性不符合傳過來的屬性
最後用 not exists
如果傳過來的屬性在產品屬性值中都存在,not exists(select * from #tempwhere charindex('_'+strValue +'_' , '_'+[AttributeValue]+'_')=0)是個條件成立的則該商品符合條件

聽起來有點複雜呀,還是我表達不清楚。
在表述一遍。
先把傳過來的要匹配的屬性拆分後存入臨時表,
然後在拿臨時表中的每一項與商品的屬性值匹配,
如果不存在(not exists)這個情況(即臨時表中的屬性值不在產品的屬性值的情況)(臨時表中的屬性值(即傳過來的屬性值)),則該商品符合條件。


繞了半天不知大家有沒有看明白...........

商品有(1_3_4_8)屬性,
假設傳過來的屬性爲1_3,則該產品符合條件,
假設傳過來的屬性爲1_3_4,則該商品也符合條件
假設傳過來的商品屬性爲1_4_9,則該商品不符合條件因爲9不在產品的屬性中。


最後來張圖吧








發佈了40 篇原創文章 · 獲贊 57 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章