MySQL 显示没有子查询的计数

MySQL Show counts without subquery

我关注table

编号 source_url target_url event_type
1 googlecom mypageurl/example 0
2 googlecom mypageurl/otherpage 0
3 googlecom mypageurl/example 0
4 googlecom mypageurl/example 0
5 mypageurl/example otherdomain/example 1
6 mypageurl/example otherdomain/example 1
7 mypageurl/otherpage otherdomain/example 1

这里event_type = 0是访问,event_type = 1是点击

使用以下查询,我可以在每个 url

上获得 visits
SELECT
    target_url,
    COUNT(target_url) AS visits
FROM
    tbl_events
WHERE
    event_type = 0 AND target_url <> ''
GROUP BY
    target_url
ORDER BY
    visits
DESC
    ;

访问次数

target_url 访问次数
mypageurl/example 3
mypageurl/otherpage 1

通过以下查询我可以获得点击次数

SELECT
    source_url,
    COUNT(source_url) AS clicks
FROM
    event_tracking
WHERE
    event_type = 1 AND source_url <> ''
GROUP BY
    source_url
ORDER BY
    clicks
DESC
    ;

点击次数

source_url 点击次数
mypageurl/example 2
mypageurl/otherpage 1

想要的结果

我希望我的最终结果如下 不使用子查询(因为原始 table 包含超过 100 万行和子查询花费的时间太长)

url 点击次数 访问次数
mypageurl/example 2 3
mypageurl/otherpage 1 1

现在,我觉得我必须创建一个临时的 table 并使用 ON DUPLICATE KEY UPDATE 并使用 url 作为主键,但我觉得可能有更好的方法我想不通。

有没有什么方法可以不使用子查询和临时查询来实现这个结果table?

试试这个

SELECT URL, 
       SUM(click) click, 
       SUM(VISIT) visit 
FROM (SELECT CASE WHEN event_type=0 
                  THEN target_url 
                  ELSE source_url END      url, 
             SUM(CASE WHEN event_type = 0 
                      THEN 1 
                      ELSE 0 END)          visit, 
             SUM(CASE WHEN event_type = 1 
                      THEN 1 
                      ELSE 0 END)          click
      FROM urlData
      GROUP BY target_url, 
               source_url,
               event_type  ) A 
GROUP BY URL