避免“客户也购买”表中的重复数据

时间:2014-11-12 21:06:30

标签: sql

我正在为商店网站编写一个功能,该功能将推荐其他客户使用当前客户购物车中的产品购买的其他产品。

我的计划是找一份拖网订单数据库并更新多对多表格的工作,跟踪每对产品彼此关联的频率。我想有这样的结构:

+--------------+--------------+----------------+
| product_a_id | product_b_id | times_together |
+--------------+--------------+----------------+
| 12           | 53           | 118            |
+--------------+--------------+----------------+

然后我意识到我不一定能避免表格定义中的数据重复与这样的行:

+--------------+--------------+----------------+
| product_a_id | product_b_id | times_together |
+--------------+--------------+----------------+
| 53           | 12           | 118            |
+--------------+--------------+----------------+

因此,为了增加新订单的关联,我必须做两个查询:

UPDATE also_bought SET times_together = times_together + 1 WHERE product_a_id = 12 AND product_b_id = 53;
UPDATE also_bought SET times_together = times_together + 1 WHERE product_a_id = 53 AND product_b_id = 12;

是否有一个更优雅的结构,我只能用一个查询更新,并避免必须复制表中数据的行?

3 个答案:

答案 0 :(得分:2)

您可以将翻转对完全排除在:

    product_a_id <> product_b_id
AND product_a_id < product_b_id

您也可以在一个UPDATE中执行此操作:

SET times_together = times_together + 1 WHERE product_a_id IN (12,53) AND product_b_id IN (12,53);

答案 1 :(得分:2)

最简单的方法:

SET times_together = times_together + 1 WHERE (product_a_id = 12 OR product_a_id = 53) AND (product_b_id = 53 OR product_b_id = 12);

答案 2 :(得分:1)

also_bought表格中,添加check约束以确保product_a_id < product_b_id。让您的工作按顺序添加条目。这避免了表中的重复。

但是,既然您希望能够以简单的方式查找产品ID对,那么创建一个also_bought与其自身联合的视图,只有ID列反转:

create view vw_also_bought as
select a as product_a_id, b as product_b_id, times_together
from (
  select product_a_id as a, product_b_id as b, times_together
  from also_bought

  union all

  select product_b_id as a, product_a_id as b, times_together
  from also_bought
)

现在,您可以在一列中查找任何产品ID,并从其他列中获取相应的配对产品ID和购买计数。