2015-09-01 47 views
-1

我正在構建電子商務PC商店,並將所有產品的規格存儲爲列(因此RAM,處理器,顏色,品牌等都不同列)
我建立了搜索以查找產品並將其鏈接到人們可以查看產品及其所有信息的頁面

當有人查看某個產品時,我想要一個「類似產品」部分。
應該得到一個基於不同列的值,這些產品並得到最佳匹配

例如說我有產品表中的位置:我如何找到類似的行,這取決於SQL/PHP中的列值

+----+------+--------+-------+--------+--------+ 
| id | Name | Type | Brand | Colour | Memory | 
+----+------+--------+-------+--------+--------+ 
| 1 | Name1| laptop | Asus | White | 2GB | 
| 2 | Name2| laptop | Acer | Red | 4GB | 
| 3 | Name3|computer| Hp | Blue | 3GB | 
| 4 | Name4| laptop | Acer | White | 6GB | 
| 5 | Name5| laptop | HP | Red | 4GB | 
+----+------+--------+-------+--------+--------+ 

比方說,用戶在觀看產品編號1 然後按順序,最好的匹配結果將是:

+----+------+--------+-------+--------+--------+ 
| id | Name | Type | Brand | Colour | Memory | 
+----+------+--------+-------+--------+--------+ 
| 4 | Name4| laptop | Acer | White | 6GB | 
| 2 | Name2| laptop | Acer | Red | 4GB | 
| 5 | Name5| laptop | Hp | Red | 4GB | 
| 3 | Name3|computer| HP | Blue | 3GB | 
+----+------+--------+-------+--------+--------+ 

所以我想,概括地說什麼,我問的是,如何將我選擇的所有行最匹配列的順序爲多少MATC hing列與當前行一致

+0

究竟是如何與產品1有關的這張表,除了顯然是h aving id = 1意味着你不想在結果中使用「id = 1」? –

+0

不,因爲他們正在查看產品id 1,所以根據您獲得「類似產品」的要求,在類似產品部分 – user3347769

+0

中顯示的產品id 1無意義,不應在數據庫中進行比較列。您應該使用相似性分數(根據需求爲每列分配序數值,並將整行視爲一組)或基於距離的度量(例如曼哈頓距離)來確定相似的組。 –

回答

1

您可以比較感興趣的項目和剩餘項目集合之間的相同列的數量,並按照匹配數量的總和進行排序。

如果你想優先考慮某個屬性,你可以改變算法以包含權重。因此,例如布爾表達式t1.Memory = t2.Memory可以將其計算爲1或0,以更改爲使用內存差異的絕對值以獲得最接近的匹配。等等。

請注意,此查詢使用固定屬性並且假定沒有空值 - 如果可能有空值需要處理(例如使用合併),並且您還可以使用動態sql來說明要比較的不同數量的屬性。

而且,並非所有的數據庫都可以計算布爾表達式像t1.Memory = t2.Memory(MySQL能),它是真正爲case when t1.Memory = t2.Memory then 1 else 0 end

select 
    t1.* 
    , sum(t1.type = t2.type) 
    + sum(t1.Brand = t2.Brand) 
    + sum(t1.Colour = t2.Colour) 
    + sum(t1.Memory = t2.Memory) as commonality 
from products t1, products t2 
where t2.id = 1 and t1.id <> t2.id 
group by t1.id, t1.Name, t1.Type, t1.Brand, t1.Colour, t1.Memory 
order by 
    sum(t1.type = t2.type) 
    + sum(t1.Brand = t2.Brand) 
    + sum(t1.Colour = t2.Colour) 
    + sum(t1.Memory = t2.Memory) desc, Brand 

Sample SQL Fiddle

與樣品的數據和ID 1作爲項目​​的簡寫形式與結果進行比較將是:

| id | Name |  Type | Brand | Colour | Memory | commonality | 
|----|-------|----------|-------|--------|--------|-------------| 
| 4 | Name4 | laptop | Acer | White | 6GB |   2 | 
| 2 | Name2 | laptop | Acer | Red | 4GB |   1 | 
| 5 | Name5 | laptop | HP | Red | 4GB |   1 | 
| 3 | Name3 | computer | Hp | Blue | 3GB |   0 | 
+0

非常感謝謝謝,非常感謝! – user3347769

+0

好答案...同樣值得注意的是,您可以使用一個因子來乘以每個總和值,以便爲特定匹配類型分配權重。就像如果你認爲類型匹配是其他因素的兩倍,那麼你可以做'sum(t1.type = t2.type)* 2' – Orangepill

+0

@Orangepill事實上,包含權重(或者甚至讓用戶確定優先順序) – jpw

相關問題