PHP MySQL: печать общего ежемесячного архива сообщений

#php #mysql

#php #mysql

Вопрос:

Мне нужно распечатать общий (подсчет) архив новостей по месяцам года (12 месяцев) в формате json следующим образом :

Вывод:

 ["January:31","February:28","March:0","April:130","May:450","June:0","July:0","August:0","September:0","October:520","November:20","December:31"]
  

Код PHP:

 SELECT COUNT(*) AS id,
YEAR(date) as `year`,
MONTH(date) as `month`,
MONTHNAME(date) as `month_name`,
FROM `aticle`
GROUP BY `year`, `month`;
  

т.е. if we dont have news in any month print:0 ПРИМЕЧАНИЕ:: "March:0","July:0".....

Как я могу это распечатать ?!

Комментарии:

1. Можете ли вы опубликовать то, что у вас есть на данный момент?

2. StackOverflow следует использовать в качестве руководства , чтобы вы получили ответ, мы не будем писать код за вас. Что вы написали до сих пор в попытке решить эту проблему?

3. SELECT COUNT(<column_containing_news_count>) AS num_of_articles, MONTHNAME(date) as month_name FROM aticle GROUP BY MONTHNAME(date); ?

4. @esqew: это правда. Но я не имею ни малейшего представления об этом. моя проблема в этом!

5. @user27133 Вы могли бы начать с выполнения запроса и загрузки результатов в массив, не так ли?

Ответ №1:

Вы можете использовать IFNULL для проверки, если данные не найдены, они должны быть 0 ..

Пожалуйста, попробуйте выполнить запрос, приведенный ниже.

 SELECT IFNULL(COUNT(*),0) AS id, YEAR(date) as `year`, MONTH(date) as `month`, MONTHNAME(date) as `month_name`,FROM `aticle`GROUP BY `year`, `month`;
  

Спасибо

Ответ №2:

Вы можете сделать это, сгенерировав строку для каждой комбинации месяца / года, которую вы хотите. Предполагая, что у вас есть хотя бы одно значение для каждого месяца и года, самый простой способ:

 SELECT COUNT(*) AS id, y.yr, m.mon, m.mname
FROM (select distinct year(date) as yr from article) y cross join
     (select distinct month(date) as mon, monthname(date) as mname from article) m left join
     article a
     on year(a.date) = y.yr and month(a.date) = m.mon
GROUP BY y.yr, m.mon;
  

В противном случае вам придется найти способ получить список всех месяцев, используя что-то вроде:

 select 1 as mon, 'Jan' as mname union all
. . . 
  

Комментарии:

1. Самый простой способ не работает. Вы проверяете это?

2. @user27133 . , , я много раз запускал подобные запросы. Как это не работает?

3. я добавляю этот код для вывода: $value = array(); foreach($stats as $key => $value){ $rows2[] = $value['mname']; } echo json_encode($rows2); вывод: [null,"February",null,"February"] это просто для печати в течение всего месяца.

4. Для печати я выбираю true way?