2015-05-05 96 views
0

随着下面的MySQL查询,我想匹配,其中page既是/signup,然后在后面的userflow /confirmMySQL的漏斗多个与运算

SELECT COUNT(*) as `total` FROM (

    SELECT COUNT(DISTINCT t.user_id) AS `visitors` 
    FROM `tracks` t 
    JOIN `user_details` u ON u.id=t.user_id AND u.site_id=t.site_id 
    WHERE t.site_id='334565' 
    AND (t.page = '/signup' AND t.page = '/confirm') 
    AND t.timestamp BETWEEN '2015-01-23 00:00:00' AND '2015-04-30 23:59:59' 
    GROUP BY t.user_id, t.track_id 
) as a 

的主要问题与此查询下来,是MySQL没有按” t按我尝试使用它的方式工作(不正确)。 另一个问题是退回的订单可能不正确,因此还需要按照指定的顺序。

也许这个查询需要完全不同,但我不知道我在正确的轨道上。

有没有人以前做过或有没有更好的方法来完成工作?

请注意,上面的WHERE子句可以匹配不仅仅是page更多,可以是任何东西,如t.referreru.somethingelse

另一个例子是:

SELECT COUNT(*) as `total` FROM (

    SELECT COUNT(DISTINCT t.user_id) AS `visitors` 
    FROM `tracks` t 
    JOIN `user_details` u ON u.id=t.user_id AND u.site_id=t.site_id 
    WHERE t.site_id='334565' 
    AND (u.browser = 'chrome' AND t.referrer_host = 'google.com' AND t.page = '/confirm' and t.page = '/preferences') 
    AND t.timestamp BETWEEN '2015-01-23 00:00:00' AND '2015-04-30 23:59:59' 
    GROUP BY t.user_id, t.track_id 
) as a 

u.browsert.referrer_hostt.page是目标,我将trying作为一个漏斗展示给大家。分析程序如何做到这一点。

+0

(t.page ='/ signup'或t.page ='/ confirm'),并且有count(distinct t.page)= 2 – jarlh

+0

@jarlh它需要在记录集中匹配,而不是返回1行与任一。 (用户流) –

+0

@smftre你需要包含你的表模式和一些数据。有点难以理解,因为它的立场 –

回答

1

我假设这是跟踪访问者的网页(不是一个艰难的假设),每个URL /页面端点都有自己的条目在跟踪表中。

为了找到碰到这两个页面的用户,您需要自行加入跟踪表。事情是这样的:

SELECT COUNT(DISTINCT t1.user_id) AS `visitors` 
FROM `tracks` t1 
JOIN `user_details` u ON u.id=t1.user_id AND u.site_id=t1.site_id 
join `tracks` t2 on t1.site_id = t2.site_id and u.id = t2.user_id and t1.track_id <> t2.track_id 
WHERE t1.site_id='334565' 
AND (t1.page = '/signup' AND t2.page = '/confirm') 
AND t1.timestamp BETWEEN '2015-01-23 00:00:00' AND '2015-04-30 23:59:59' 

我不认为有任何需要分组,因为我认为你只是想已经签署了,然后确认访问者的不同数量。

+0

这是否意味着我每次添加“目标”时都必须加入另一个表格?这看起来是一个非常不完善的方法。我是否错误地处理了这个问题? –

+0

加入并不是一件坏事。但如果你想跟踪流量(基本上是分层数据),那么是的,这基本上是你如何做到的。另一方面,如果你不关心访问顺序,你可以做得更简单一些 –