在代表商店的数据库中,我有下表:
table name:
CLIENTS_PRODUCTS
columns:
client_id (INT)
product_name (CHAR(256))
如您所见,每个产品购买都存储在表格中的记录中。
鉴于客户A,我想找到所有客户X,其中有任何A(pA)产品和X(pX)的任何产品,使得pA是pX的前缀。
简而言之:我需要在同一个表中的不同记录之间执行比较。我想通过JOIN
CLIENTS_PRODUCTS本身来做这件事。这是正确的方法吗?
我在SO中搜索过,找不到这个问题的直接答案。
答案 0 :(得分: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
答案 1 :(得分: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。您的应用程序将处理产品前缀的重新处理,以便从数据库中取出负载。通过修改上面的SP的JOIN ... ON products.id = prod_parents.parent_id
,你将得到一个简单的整数比较。