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
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