2015-03-02 2 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 в ежемесячном счетчике! Я также попытался использовать RIGHT JOIN в SQL-запросе, чтобы получить все клиенты, поэтому array_replace_recursive в PHP может работать нормально, поскольку я думаю, что он не работает должным образом на данный момент, но не имеет успеха и снова получил неправильные результаты.

Может ли кто-нибудь показать мне способ сделать работу?

+0

Просто на будущее, вы должны добавить SQLFiddle всякий раз, когда это возможно для материала базы данных. На самом деле экономит время людей и быстрее дает вам ответ. – Jhecht

ответ

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" 

регулировки ИНЕКЕ в подзапросе в течение нескольких месяцев, и все

$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" 
Смежные вопросы