2015-03-02 64 views
0

合并的结果我有一个存储的客户像这样的表:如何计算记录在MySQL和PHP

id name 
-- ---- 
1  John 
2  Jane 
... 

我也有存储客户创建链接的另一个表:

id client_id link created 
-- --------- ---- ----------- 
1  1   ...  2015-02-01 
2  1   ...  2015-02-26 
3  1   ...  2015-03-01 
4  2   ...  2015-03-01 
5  2   ...  2015-03-02 
6  2   ...  2015-03-02 

我需要找到客户今天,本月和所有时间创建了多少链接。我在结果中也需要他们的名字,所以我可以用一个HTML表格来显示统计信息。我以为我可以尽可能少这样的代码:

$today = $this->db->query("SELECT COUNT(*) as today, c.id as client_id, c.name FROM `links` l JOIN `clients` c ON l.client_id = c.id WHERE DATE(l.created) = CURDATE() GROUP BY c.id"); 

$this_month = $this->db->query("SELECT COUNT(*) as this_month, c.id as client_id, c.name FROM `links` l JOIN `clients` c ON l.client_id = c.id WHERE YEAR(l.created) = YEAR(NOW()) AND MONTH(l.created) = MONTH(NOW()) GROUP BY c.id"); 

$yet = $this->db->query("SELECT COUNT(*) as yet, c.id as client_id, c.name FROM `links` l JOIN `clients` c ON l.client_id = c.id WHERE GROUP BY c.id"); 

然后在PHP将它们合并为我之前问HERE,像这样:

$result = array_replace_recursive($today, $this_month, $yet); 

所以,我就可以循环到结果并打印我的HTML表格。

但这里有逻辑问题。一切正常,但一个月的结果是错误的数字,例如,一个人创建的所有链接都是1,但它在月度计数器中显示为4!我也尝试在SQL查询中使用RIGHT JOIN来获取所有客户端,因此PHP中的array_replace_recursive可以正常工作,因为我认为它目前无法正常工作,但没有成功,并且又得到了错误的结果。

任何人都可以告诉我一种完成工作的方法吗?

+0

只是以供将来参考你应该添加一个SQLFiddle尽可能对数据库的东西。真正节省时间,让你更快得到答案。 – Jhecht 2015-03-02 07:07:51

回答

0

此查询应该为今天做

$query_today=" 
SELECT name, id AS user_id, (
SELECT COUNT(*) 
FROM links 
WHERE client_id = user_id AND created = '2015-03-02' 
) AS alllinks 
FROM clients" 

调整子查询的WHERE子句个月,所有

$query_month=" 
SELECT name, id AS user_id, (
SELECT COUNT(*) 
FROM links 
WHERE client_id = user_id AND created like '2015-03%' 
) AS alllinks 
FROM clients" 

$query_all=" 
SELECT name, id AS user_id, (
SELECT COUNT(*) 
FROM links 
WHERE client_id = user_id 
) AS alllinks 
FROM clients"