美文网首页
【MYSQL 第4篇】left join 数据结果比预计值大的问

【MYSQL 第4篇】left join 数据结果比预计值大的问

作者: 晟文刀 | 来源:发表于2016-08-21 11:39 被阅读261次

近期我在做路径转化分析,发现用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、增加唯一识别的主键。

相关文章

网友评论

      本文标题:【MYSQL 第4篇】left join 数据结果比预计值大的问

      本文链接:https://www.haomeiwen.com/subject/mizisttx.html