2013-05-17 97 views
0

在表示商店的數據庫,我有如下表:MySQL的:同一個表中的記錄彼此比較

table name: 
    CLIENTS_PRODUCTS 
columns: 
    client_id (INT) 
    product_name (CHAR(256)) 

正如你所看到的,每個產品的購買被存儲爲一個記錄表。

給定客戶端A,我想查找所有客戶端X,其中有A(pA)和X(pX)的任何乘積,使得pA是pX的前綴。

簡而言之:我需要在同一個表內的不同記錄之間執行比較。我以爲自己的CLIENTS_PRODUCTS就是通過JOIN來做的。這是正確的方式嗎?

我在SO搜索周圍找不到直接的答案。

回答

1

該版本假設product_names包含單個產品(儘管列名稱):

select distinct cp.client_id 
from (select 
     from clients_products cp 
     where client_id = A 
    ) a join 
    client_products cp 
    on cp.product_names like concat(a.product_names, '%') and 
     cp.client_id <> a.client_id 

如果product_names確實是一個逗號分隔的產品列表中,那麼我們可以修改此:

select distinct cp.client_id 
from (select 
     from clients_products cp 
     where client_id = A 
    ) a join 
    client_products cp 
    on concat(',', cp.product_names, ',') like concat('%,', a.product_names, '%,%') and 
     cp.client_id <> a.client_id 
+0

哦,對不起,我編輯的名字。 – Subway

0

該結構似乎不利於你想要完成什麼,但我想你可以使用REGEXP表達式來破解它。這可能會很慢,這取決於表格的大小。

SELECT DISTINCT prod_parents.client_id 
FROM CLIENTS_PRODUCTS AS products 
JOIN CLIENTS_PRODUCTS AS prod_parents ON 
    prod_parents.product_names REGEXP CONCAT("^",products.product_names) 
    #AND prod_parents.client_id <> products.client_id 
WHERE products.client_id = ? AND products.product_names = ? 

如果您不希望客戶端A與其他客戶端一起返回,請在JOIN上取消註釋AND。

另一種方法是將parent_id添加到表中,並且如果正在插入與product_names前綴匹配的新行,則會將該記錄的id分配爲parent_id。你的應用程序會處理產品前綴的regexing,這樣負載將從數據庫中取出。通過修改上述SP的JOIN ... ON products,您將得到一個簡單的整數比較.id = prod_parents.parent_id