mysql - 组合回收多个自连接的mysql查询

标签 mysql join simplify

我有以下一组 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 个查询遵循相同的模式 - 是否有更好的构造查询的方法,这意味着我没有继续查询“有多少人达到了第 2 阶段”?

编辑:每个页面浏览量都存储为 formation_page_hits 中的一个条目 - 这样每个 session 的页面浏览量都有一个完整的记录

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

最佳答案

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) 上创建复合索引以使其快速运行。

关于mysql - 组合回收多个自连接的mysql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5461743/

相关文章:

uml - 处理 UML 事件图中的组合对象

php - mySql为购物车选择多个可能重复ID的ID

mysql - 从两个表中选择值

mysql - 链接 MySQL 表中的行

php - 使用多个联接和 Group_Concat 优化 php mySQL 查询

javascript - 有没有办法进一步简化这些 javascript 函数?

php - 具有分组依据和跨列比较的 SQL (PHP)

mysql - 向除一张表之外的所有表授予 MySQL 权限

php - AJAX/MySQL/PHP 问题

c++ - 组成员函数都需要先隐式互斥锁?