【问题标题】:Mysql refrencing derived tables from nested queryMysql从嵌套查询中引用派生表
【发布时间】:2011-07-16 20:30:54
【问题描述】:

我昨天发布了与此类似的内容,但现在我想要一些与我的查询有所不同的内容-

我正在尝试查询数据库以检索一段时间内访问过网站的一次性用户的数量。数据看起来像这样:

Day | UserID  
  1 | A  
  1 | B  
  2 | B  
  3 | A  
  4 | B  
  4 | C  
  5 | D  

我希望查询结果看起来像这样

Time Span      | COUNT(DISTINCT UserID)  
Day 1 to Day 1 | 2  
Day 1 to Day 2 | 1  
Day 1 to Day 3 | 0  
Day 1 to Day 4 | 1  
Day 1 to Day 5 | 2  

结果是 2,1,0,1,2,因为在那些日子结束时,有 X 个用户访问过一次。例如第 5 天,在第 5 天结束时,用户 c 和 d 分别只访问过一次。

我想我正在寻找类似这样的查询:

select d.day, (select count(distinct userid) from visits where day<=d.day)
from (select distinct day from visits) d

上面的查询和我正在寻找的不同之处在于,我希望这个新查询只考虑每个时间跨度的一次性用户,而不是重复用户。

谢谢

【问题讨论】:

  • 一次性用户,结果不应该是2,0,0,1,1吗?

标签: mysql sql derived-table nested-queries


【解决方案1】:

这个子查询应该适用于明确的要求。

select d.day, count(distinct case when b.userid is null then a.userid end)
from (select day from visits group by day) d
inner join
(
select a.day, a.userid, count(*) c
from visits a
join visits b on a.userid=b.userid and b.day <= a.day
group by a.day, a.userid
having count(*) = 1
) a on a.day <= d.day
left join
(
select a.day, a.userid, count(*) c
from visits a
join visits b on a.userid=b.userid and b.day <= a.day
group by a.day, a.userid
having count(*) > 1
) b on a.userid = b.userid and b.day <= d.day
group by d.day

原创

您一定是从 SQL Server 中获得了这个想法 - 它是唯一允许您引用两次删除(嵌套)查询的 RDBMS (IIRC)。请指出您想要什么,我们可以重写查询。

对于显示的确切查询,您不需要 2 级子查询

SELECT  
    C.col_c1 AS Data,
    (
        SELECT count(col_b1)
        FROM tbl
        WHERE col_b2 <= C.col_c1
    ) A
FROM (
    SELECT col_c1 # subquery to get distinct c1
    FROM tbl
    GROUP BY col_c1) C;

【讨论】:

  • 基本上我比昨天成功回答的帖子更进一步。 stackoverflow.com/questions/5317917/… 这次我希望查询显示仅访问过一次的唯一用户的增长情况。考虑到随着时间的推移一次性和重复用户增长,我的上一篇文章更广泛。感谢您的回答
  • @Tucker fyi - 如果已成功回答,您应该在解决问题的答案旁边打勾
  • @Richard aka cyberwiki 感谢您的建议,我对帖子进行了编辑。我认为它现在更清楚了。
  • 我测试了您的新查询,但没有给出正确的结果。对于每个时间跨度,首次用户计数(按时间顺序)产生 2,0,0,1,1。仍然试图找出原因。谢谢
  • 从第 1 天和第 2 天开始,共有 3 次访问。第一个来自用户a,第二个来自用户b,第三个来自用户b。该范围内的用户 b 是重复用户。用户 a 仍然是一次性用户。
猜你喜欢
  • 2021-11-03
  • 2018-02-21
  • 2017-08-10
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多