Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 计算外键首次出现的次数_Php_Mysql - Fatal编程技术网

Php 计算外键首次出现的次数

Php 计算外键首次出现的次数,php,mysql,Php,Mysql,除了标签,如果可能的话,我想在查询中解决这个问题。 我有这张桌子 activity_type | value | date | company_id network.new | 1 | 2011-10-08 | 1 members.count | 3 | 2011-10-08 | 1 network.new | 1 | 2011-10-10 | 2 network.new | 1 | 2011-10-11 | 3 members.count

除了标签,如果可能的话,我想在查询中解决这个问题。 我有这张桌子

activity_type | value | date       | company_id
network.new   | 1     | 2011-10-08 | 1
members.count | 3     | 2011-10-08 | 1
network.new   | 1     | 2011-10-10 | 2
network.new   | 1     | 2011-10-11 | 3
members.count | 4     | 2011-10-11 | 2
  • 这基本上是一个日志活动
  • “network.new”活动仅发生 每个公司id一次
  • “成员计数”活动仅在 “network.new”按公司id显示,每天可显示一次 公司id
我需要做一个线图,X轴是日期,Y轴是两个东西的数量:

  • 第一次活动中,每天有多少公司ID成员 时间(正是这一点让我很难过)
  • 有多少人拥有network.new活动,而只有该活动 每一天
  • 我尝试过的所有查询都给出了假阳性列表,主要是因为它统计每天都有“成员计数”活动的公司ID

    如果可能,我希望创建一个查询,为我提供日期、首次成员、新公司列,以便
    create view
    使用。 我希望我的问题足够清楚,而不是愚蠢,因为我在任何地方都找不到任何与我的问题相近的东西

    [编辑]

    由于我的英语很差,我说不清楚,我想再解释一点:

    我的客户有一个公司网络,他希望知道有多少 公司每天都在加入网络,但有一个陷阱:一家公司 登录网络时,它仅被视为已完成 一个是它也有注册会员。所以他想知道,有多少 公司注册“不完整”,有多少公司注册“完整” 报名吧

    奥利·琼斯先生把我引向了正确的方向,我想我可以用他给我的东西,但现在还没有。
    顺便说一下,谢谢奥利·琼斯的回答。像你这样的答案让我爱上了这个网站。

    我要冒出我的风险,猜猜你想要什么。你问的是“每天有多少公司ID的会员首次参加活动”。恕我直言,这是一个很难理解的说法

    我想你的意思是:每天有多少公司id值第一次出现在网络中。新的活动类型,其中有多少伴有非零成员。在同一天计算项目,有多少没有

    以下是您要做的:

    首先考虑一个查询,它将给出系统中出现的每个公司的第一个日期。试试这个

    SELECT MIN(date) networknewdate, company_id
      FROM table
     WHERE activity_type = 'network.new'
     GROUP BY company_id
    
    这将生成networknewdate、company\u id的虚拟表

    接下来,您需要一个查询,该查询将给出每个公司的members.count项出现的第一个日期

       SELECT MIN(date) memberscountdate, company_id
         FROM table
        WHERE activity_type = 'members.count'
        GROUP BY date
    
    好的,现在我们有两个很好的虚拟表,每个表的每个公司id值最多有一行。让我们加入他们,推动第一个(network.new)值的加入

    这将返回三列:日期、公司id和“是”或“否”,说明是否有第一个成员。计数记录与第一个网络在同一天。每个公司id的新记录

    现在你需要总结一下这整件事,这样你每天就能得到一条记录,上面列出了“是”和“否”项目的数量。我们开始吧

    按天列出的“是”记录数

    SELECT networknewdate, count(*) yesrecords
      FROM (
          SELECT a.networknewdate, 
                 a.company_id,
                 IFNULL(b.members_present, 'no') members
            FROM (
              SELECT MIN(date) networknewdate, company_id
                FROM table
               WHERE activity_type = 'network.new'
               GROUP BY company_id
            ) a
            LEFT JOIN (
             SELECT MIN(date) memberscountdate, company_id, 'yes' members_present
               FROM table
              WHERE activity_type = 'members.count'
              GROUP BY date
            ) b ON (a.networknewdate = b.memberscountdate and a.company_id = b.company_id)
         ) r
     WHERE r.members = 'yes'
     GROUP BY networknewdate
    
    按日期列出的无记录数是一个类似的查询。然后,您需要在networknewdate上将这两个查询左键连接在一起,这样您就可以得到一个日期表、yesrecords和norecords。我将把这个作为剪贴练习留给你。它比我编写的以
    groupbynetworknewdate
    结尾的查询长一倍多

    欢迎使用实现真实世界业务逻辑的SQL!我认为这个问题的重要教训是,你要求的结果实际上很难具体说明。一旦您准确地指定了您想要的内容,编写查询以获取它将是乏味和重复的,但并不困难


    另一个小提示。您可以创建一些视图,这样查询就不会太多

    因此,使用奥利·琼斯向我展示的相同方法,我找到了答案: 首先,我需要一个“会员计数”或“网络新”发生的日期列表

    SELECT date as current_date
    FROM activity_log ld
    WHERE `activity_type` in ('members_count', 'network.new')
    GROUP BY date
    ORDER BY date
    
    我给他们留下了第一次约会的公司名单

    SELECT MIN(date) AS new_date, company_id
    FROM activity_log
    WHERE activity_type =  'network.new'
    GROUP BY company_id
    ORDER BY date
    
    还留下了第一次加入一家公司计数的成员

        SELECT min(date) as members_count_date, company_id 
    FROM `activity_networks` WHERE `activity_type` = 'network.daily.members_count'
    GROUP BY company_id 
    ORDER BY date
    
    然后a对新公司和首次统计成员的公司进行分类统计,按日期分组。那么我有这个,

        SELECT DATE(FROM_UNIXTIME(ld.date)) as curr_date,
    COUNT(DISTINCT(new_co)) as new_co,
    COUNT(DISTINCT(complete_co)) as complete
    FROM activity_log ld 
    LEFT JOIN (SELECT date AS new_date, company_id as new_co
    FROM activity_networks
    WHERE activity_type =  'network.new'
    GROUP BY company_id
    ORDER BY date) nd ON (ld.date=nd.new_date)
    LEFT JOIN (SELECT min(date) as members_count_date, company_id as complete_co
    FROM `activity_log` WHERE `activity_type` = 'members_count'
    GROUP BY company_id 
    ORDER BY date) mcd ON (mcd.members_count_date=ld.date)
    WHERE `activity_type` in ('members_count', 'network.new')
    GROUP BY DATE(FROM_UNIXTIME(ld.date))
    ORDER BY ld.date
    

    独特的功能是至关重要的,因为没有它计数是不正确的。它并不完美。我命名为“new_co”(新公司)的专栏应只提供不完整的注册(不完整的意思是,新注册没有与公司关联的成员),但信息仍然有用。

    您能给我们一个示例结果吗。猜猜你说的会员和第一次是什么意思。谢谢,这很有帮助,但不完全是我需要的。我知道了,很高兴你知道了。
        SELECT DATE(FROM_UNIXTIME(ld.date)) as curr_date,
    COUNT(DISTINCT(new_co)) as new_co,
    COUNT(DISTINCT(complete_co)) as complete
    FROM activity_log ld 
    LEFT JOIN (SELECT date AS new_date, company_id as new_co
    FROM activity_networks
    WHERE activity_type =  'network.new'
    GROUP BY company_id
    ORDER BY date) nd ON (ld.date=nd.new_date)
    LEFT JOIN (SELECT min(date) as members_count_date, company_id as complete_co
    FROM `activity_log` WHERE `activity_type` = 'members_count'
    GROUP BY company_id 
    ORDER BY date) mcd ON (mcd.members_count_date=ld.date)
    WHERE `activity_type` in ('members_count', 'network.new')
    GROUP BY DATE(FROM_UNIXTIME(ld.date))
    ORDER BY ld.date