我有一个存储这样的客户的表:
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");
然后在我之前问HERE之前将它们合并到PHP中,就像这样:
$result = array_replace_recursive($today, $this_month, $yet);
所以我能够循环到结果并打印我的HTML表格。
但这里存在逻辑问题。一切正常,但一个月的结果是一个错误的数字,例如,一个人的整个创建的链接是1,但它在月度计数器中显示4!我还尝试在SQL查询中使用RIGHT JOIN来获取所有客户端,因此PHP中的array_replace_recursive可以正常工作,因为我认为它目前无法正常工作,但没有成功并且再次出错。
有人能告诉我一种完成工作的方法吗?
答案 0 :(得分: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"