Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

So sánh ngày / tác giả trong MySQL

Tôi nghĩ rằng bạn nên tạo một bảng tham chiếu ngày, điền bảng đó và sau đó LEFT OUTER JOIN từ bảng đó trong truy vấn của bạn. Vấn đề 'Làm cách nào để hiển thị ngày bị thiếu?' khá là một câu hỏi SO phổ biến nhưng tôi vẫn sẽ tiếp tục.

Bước trước

Tại dấu nhắc mysql chạy:

use WordPress;

Bước 1 - Tạo Bảng Tham chiếu Ngày

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));

Bước 2 - Điền Bảng Tham chiếu Ngày

Ý tưởng của bảng này là có một hàng cho mỗi ngày. Bây giờ bạn có thể đạt được điều này bằng cách chạy câu lệnh chèn ad nauseum nhưng tại sao không viết một quy trình để điền nó cho bạn (bạn có thể tạo một Sự kiện đã lên lịch trong MySQL để đảm bảo rằng bạn luôn có một bộ ngày hoàn chỉnh trong bảng. Đây là một gợi ý cho quy trình đó:

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 ;

Bây giờ bạn có thể chạy:

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

Để điền tất cả các ngày cho tháng 10 (hoặc chỉ tạo days_into_the_future tham số cho bất cứ điều gì bạn muốn).

Bây giờ bạn đã có một bảng tham chiếu ngày với tất cả các ngày mà bạn muốn điền vào, bạn có thể tiếp tục và chạy truy vấn của mình cho tháng 10:

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. Đặt kết quả của một truy vấn thành một biến trong MySQL

  2. Phương thức đăng nhập xác thực mã thông báo cookie

  3. MySql, tách một chuỗi và chèn vào bảng

  4. Cách tạo động câu lệnh MYSQL UPDATE dựa trên các biến được xác định từ HTML FORM

  5. java.sql.SQLException:Đã đóng