Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL сравнение дата/автор

Смятам, че трябва да създадете таблица с референтни дати, да попълните тази таблица и след това 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql - мога ли да попитам колко connect_errors даде даден хост?

  2. Формат на датата и изясняване на SQL заявката

  3. Как да шифровате трафика от хибридна облачна база данни

  4. Как да архивирам и възстановя MySQL база данни?

  5. Как да използвате постоянна връзка на mysqli на различни страници