MySQL дата / сравнение автора - PullRequest
0 голосов
/ 27 октября 2011

В StackOverflow был предыдущий вопрос на эту тему (могу вставить ссылку, на данный момент у меня нет привилегий), озаглавленный «Фильтр сравнения дат MySQL», и он идет как расширение этого.

У меня есть несколько авторов в моем блоге WordPress, и я хотел бы получить их производительность через MySQL.Следующий запрос работает очень хорошо в MySQL, чтобы получить сообщение автора за определенный промежуток времени только один день:

SELECT      SQL_CALC_FOUND_ROWS wp_posts.* 
FROM        wp_posts 
  JOIN      wp_postmeta 
  ON        (wp_posts.ID = wp_postmeta.post_id) 
WHERE       wp_posts.post_type = 'post' 
  AND       post_author = '50'
  AND       post_date
    BETWEEN STR_TO_DATE('2011-10-27 14:19:17','%Y-%m-%d %H:%i:%s')
      AND   STR_TO_DATE('2011-10-27 14:51:17','%Y-%m-%d %H:%i:%s')
GROUP BY    wp_posts.ID 
ORDER BY    wp_posts.post_date DESC 
LIMIT       0, 100

Но он дает мне только сообщения за этот день в течение этого часового диапазона.Я хотел бы получить таблицу с ежедневными данными, заполненными для каждого дня и каждого автора.Каждый день и каждого автора должно быть количество публикаций, опубликованных этим автором в этот день и в этот интервал времени.

Вывод должен выглядеть примерно так:

October Auth1 Auth2  Auth3
1   0   0   0
2   0   0   0
3   0   1   0
4   0   2   0
5   1   0   0
6   0   2   0
7   0   0   0
8   3   0   0
9   0   0   0
10  5   1   0
11  1   0   0
...
31  2   1   1

Таким образом, дата должна быть переменной, но я бы хотел включить всех авторов, поэтому я бы удалил строку post_author AND,

Я не эксперт в MySQL, но мне интересно, можно ли сделать это более или менее легко и экспортировать результаты запроса (или, точнее, некоторые поля результатов запроса) в виде таблицы, напримерпоказано на рисунке.

Ответы [ 3 ]

1 голос
/ 28 октября 2011

Я считаю, что вы должны создать справочную таблицу дат, заполнить эту таблицу, а затем LEFT OUTER JOIN из этой таблицы в своем запросе.Проблема «Как отобразить недостающие даты?»это довольно общий вопрос SO , но я все равно пойду на него.

Предварительный шаг

При запуске mysql:

use WordPress;

Шаг 1 - Создать справочную таблицу дат

create table all_date 
(id int unsigned not null primary key auto_increment, 
a_date date not null,
last_modified timestamp not null default current_timestamp on update current_timestamp,
unique key `all_date_uidx1` (a_date));

Шаг 2 - Заполнить справочную таблицу дат

Идеяэта таблица должна иметь одну строку для каждой даты.Теперь вы могли бы достичь этого, выполнив операторы вставки ad nauseum, но почему бы не написать подпрограмму для ее заполнения (вы можете создать событие MySQL по расписанию , чтобы у вас всегда был полный набор дат вТаблица. Вот предложение для этой процедуры:

DELIMITER //


CREATE PROCEDURE populate_all_dates(IN from_date DATE, IN days_into_future INT)

BEGIN

 DECLARE v_date DATE;
 DECLARE ix int;


 SET ix := 0;
 SET v_date := from_date;


 WHILE v_date <= (from_date + interval days_into_future day) DO

  insert into all_date (a_date) values (v_date) 
  on duplicate key update last_modified = now();

  set ix := ix +1;

  set v_date := from_date + interval ix day;

 END WHILE;

END//

DELIMITER ;

Теперь вы можете выполнить:

call populate_all_dates('2011-10-01',30);

Чтобы заполнить все даты за октябрь (или просто поверните параметр days_into_the_future довсе, что вы хотите).

Теперь, когда у вас есть справочная таблица дат со всеми интересующими вас датами, вы можете продолжить и выполнить свой запрос на октябрь:

select day(a.a_date) as 'October',
IFNULL(t.a1,0) as 'Auth1',
IFNULL(t.a2,0) as 'Auth2',
IFNULL(t.a50,0) as 'Auth50'
from all_date a
LEFT OUTER JOIN
(
SELECT date(wp.post_date) as post_date,
sum(case when wp.post_author = '1' then 1 else 0 end) as a1,
sum(case when wp.post_author = '2' then 1 else 0 end) as a2,
sum(case when wp.post_author = '50' then 1 else 0 end) as a50,
count(*) as 'All Auths'
FROM wp_posts wp
WHERE  wp.post_type = 'post'
AND wp.post_date  between '2011-10-01' and '2011-10-31 23:59:59'
GROUP BY date(wp.post_date)
) t
ON a.a_date = t.post_date
where a.a_date between '2011-10-01' and '2011-10-31'
group by day(a.a_date);
1 голос
/ 27 октября 2011

Я не собираюсь переписывать весь ваш запрос, но вот как вы будете группировать данные:

SELECT ...
FROM ...
WHERE YEAR(post_date) = 2011 AND MONTH(post_date) = 10
GROUP BY DAY(post_date), HOUR(post_date)

Создание нескольких столбцов для каждого автора не является хорошим использованием запроса. Такое преобразование лучше сделать в вашем коде WordPress.

Обратите внимание, что этот запрос будет работать с точными тактовыми периодами, 1:00, 2:00, 3:00 и т. Д. ... Если вам нужно произвольное время (1:05, 2:05, 3:05 и т. Д.), Этот выигрыш не работать, и вам понадобится более сложная группировка.

0 голосов
/ 28 октября 2011

В приведенном ниже запросе будет сгруппировано количество сообщений по автору.

SELECT      DAY(post_date) as d, MONTH(post_date) as m, YEAR(post_date) as y, post_author, COUNT(id) as c
FROM        wp_posts 
  JOIN      wp_postmeta 
  ON        (wp_posts.ID = wp_postmeta.post_id) 
 WHERE       wp_posts.post_type = 'post' 
  AND       post_date
    BETWEEN STR_TO_DATE('2011-10-27 14:19:17','%Y-%m-%d %H:%i:%s')
      AND   STR_TO_DATE('2011-10-27 14:51:17','%Y-%m-%d %H:%i:%s')
GROUP BY    d, m, y, post_author
ORDER BY    y, m, d, post_author 
LIMIT       0, 100

Будет выведена таблица типа:

d   m   y    post_author    c
------------------------------------
2   10  2011  50    23
2   10  2011  51    12
2   10  2011  52    6

, например, для строки 1: 2 октября 2011 г.Автор с id 50 имеет 23 сообщения.Сначала вы должны получить авторов в массив, чтобы сформировать заголовок вашей таблицы.Затем итерируя этот результат с помощью PHP, вы можете сгенерировать таблицу так, как вы хотите, с соответствующим размещением 's' и 's'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...