近期我在做路徑轉化分析,發現用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、增加唯一識別的主鍵。