近期我在做路径转化分析,发现用left join嵌套查询输出的结果远比预计结果要大,先来看看例子:
CREATE TABLE `atext`;
USE `atext`;
CREATE TABLE `用户行为`(
id INT,
UUID CHAR(32),
date_str DATE,
pv_sid INT,
pv_seq INT,
click_event CHAR(10)
);
LOAD DATA LOCAL INFILE 'C:\\Users\\yuankun\\Desktop\\501.csv' INTO TABLE 用户行为 FIELDS TERMINATED BY ',';
#"用户行为"表导入了2261条记录
CREATE TABLE `用户行为2`(
id INT,
UUID CHAR(32),
date_str DATE,
pv_sid INT,
pv_seq INT,
click_event CHAR(10)
);
LOAD DATA LOCAL INFILE 'C:\\Users\\yuankun\\Desktop\\502.csv' INTO TABLE 用户行为2 FIELDS TERMINATED BY ',';
#"用户行为2"表导入了9890条记录
SELECT a.*,b.* FROM
(SELECT
DISTINCT
`id`
,UUID
,date_str
,pv_sid
,pv_seq
,click_event
FROM `用户行为`) a
LEFT JOIN
(SELECT
DISTINCT
`id`
,UUID
,date_str
,pv_sid
,pv_seq
,click_event
FROM `用户行为2`) b
ON a.uuid = b.uuid
AND a.pv_sid = b.pv_sid
#数据结果是3310条记录,比预计应该输出a表的记录2261条多了很多。
这是什么原因呢?
原因就是"用户行为"表中的uuid 和pv_sid与"用户行为2"表中的uuid 和pv_sid是一对多的关系,故输出的结果会是多对多,使“用户行为”表复制相应的条数匹配与“用户行为2”表已经对应好的记录。
所以在每个子查询中加入了distinct,依然会出现以上情况。如果去掉distinct,同样原理,会出现多对多的情况,输出结果会更离谱。
如何解决以上情况:
1、转化思路,用其他的方法来计算用户路径转化;
2、增加唯一识别的主键。