2011-03-28 48 views
1

我有以下一组MySQL查询,用于跟踪用户通过网站的进度。有没有简化它们的好方法?结合回收多个自加入的mysql查询

#How many people reached stage 2 
SELECT COUNT(DISTINCT a.session_id) as "total" 
    FROM formation_page_hits a 
    WHERE a.progress = 2 
    AND DATE(a.datetime) = "2011-03-23"; 

#How many people reached stage 4 having reached stage 2 
SELECT COUNT(DISTINCT a.session_id) as "total" 
    FROM formation_page_hits a, (SELECT f.session_id, f.`datetime` 
         FROM formation_page_hits f 
         WHERE f.progress = 2) as b 
    WHERE a.progress = 4 
    AND a.session_id = b.session_id 
    AND DATE(b.datetime) = "2011-03-23" 
    AND DATE(a.datetime) = "2011-03-23"; 


#How many people reached stage 7, having reached stage 4, having reached stage 2 
SELECT COUNT(DISTINCT a.session_id) as "total" 
    FROM formation_page_hits a, (SELECT f.session_id, f.`datetime` 
         FROM formation_page_hits f 
         WHERE f.progress = 4) as b, (SELECT f.session_id, f.`datetime` 
         FROM formation_page_hits f 
         WHERE f.progress = 2) as c 
    WHERE a.progress = 7 
    AND a.session_id = b.session_id 
    AND a.session_id = c.session_id 
    AND DATE(c.datetime) = "2011-03-23" 
    AND DATE(b.datetime) = "2011-03-23" 
    AND DATE(a.datetime) = "2011-03-23"; 

正如你所看到的,我很快重新查询相同的信息,也有遵循相同的模式附加4个或5个查询 - 在那里建造这意味着我查询一个更好的办法不必一直询问“有多少人到达第二阶段”?

编辑:每个页面视图存储为formation_page_hits的条目 - 因此存在的页面浏览量为每个会话

id_formation_page_hits INT PRIMARY_KEY, session_id VARCHAR(100), datetime DATETIME, progress INT 
+0

我们可以缓存临时表格的结果吗? – 2011-03-28 16:04:18

+0

对于任何'progress','session_id'都可以有多个记录吗? – Quassnoi 2011-03-28 16:06:16

+0

是的,每个'session_id'都有多个条目(每个页面视图对应一个会话) - 每个页面都附有一个特定的'progress'编号 – Jon 2011-03-28 16:10:59

回答

1
SELECT COUNT(*) 
FROM (
     SELECT session_id 
     FROM formation_page_hits 
     WHERE progress IN (2, 4, 7) 
       AND datetime >= '2011-03-23' 
       AND datetime < '2011-03-24' 
     GROUP BY 
       session_id 
     HAVING COUNT(DISTINCT progress) = 3 
     ) q 

(session_id, datetime, progress)为此创建一个综合指数的完整记录快速工作。

+0

返回0行 - 每个'session_id'将会有可变数量的记录,覆盖3个以上唯一的'progress'值。 q在查询结束时有什么目的? – Jon 2011-03-28 16:21:33

+0

@Jon:纠正了一个错字,但这不应该真的马虎。您应该调整常数以匹配列表中的项目数量。 'q'是分析器所需的子查询别名。此外,这个查询不能返回'0'行,尽管它可能会返回'1'行'0'。会发生什么? – Quassnoi 2011-03-28 16:25:11

+0

我的不好 - 不知道我在datetime的DATE()函数中添加了哪些错误,但现在正在工作的A-OK。非常感谢! – Jon 2011-03-28 16:33:33