2011-10-31 28 views
2

previous questionにテーブルを作成し、その月の日付を入力することができますが、そのテーブルにわずかに異なる値を設定したいとします。毎月の各日に3つの異なる時間間隔。MySQLのクエリで3時間の時間間隔

その質問、Tom Macすることにより、このコードによると:

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

そして、

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

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

を実行する可能性があり、私はこれに似た作者と日によって私のワードプレスのブログで投稿数、でテーブルを取得するだろうとして

+---------+---------+-------+------+---------+ 
| October | Auth1 | Auth2 | Auth3| Auth4 | 
+---------+---------+-------+------+---------+ 
|  1 |  0 |  0 | 0 |  0 | 
|  2 |  0 |  0 | 1 |  0 | 
|  3 |  4 |  4 | 6 |  2 | 
|  4 |  4 |  3 | 5 |  2 | 
|  5 |  7 |  0 | 5 |  2 | 
|  6 |  4 |  4 | 0 |  2 | 
|  7 |  0 |  2 | 1 |  2 | 
|  8 |  0 |  0 | 7 |  0 | 
..... 
etc 

しかし、私が持っているものは、毎日3つの異なる行に分けられ、それぞれが以下の時間範囲に対応しています。

00:00-14:30 14:31-18:15 18:16 -23:59

このように、表にはどのような時間範囲が表示されるかわからないので、良い方法は1日目、1時間目の範囲(1-1 )、など)。

+---------+---------+-------+------+---------+ 
| October | Auth1 | Auth2 | Auth3| Auth4 | 
+---------+---------+-------+------+---------+ 
| 1-1 |  0 |  0 | 0 |  0 | 
| 1-2 |  0 |  0 | 0 |  0 | 
| 1-3 |  0 |  0 | 0 |  0 | 
| 2-1 |  0 |  0 | 1 |  0 | 
| 2-2 |  0 |  0 | 0 |  0 | 
| 2-3 |  0 |  0 | 0 |  0 | 
| 3-1 |  1 |  2 | 3 |  0 | 
| 3-2 |  1 |  2 | 2 |  2 | 
| 3-3 |  2 |  0 | 1 |  0 | 
etc... 

ご覧のとおり、3行の合計は、その日の以前の一意の行のそれぞれに相当します。

これは可能ですか?

+0

私は疑問を理解して...あなただけの割合を成長させる受け入れるべきではありません...しかし、2の一つが、受け入れられなかった残りは、受け入れることの価値があります(http://stackoverflow.com/questions/4830261/i-want-an-auto-hard-refresh-not-a-simple-auto-refresh-on-my-webpages/6938551#6938551)... acceptあなたはこのソリューションを具体的に使用しているわけではありませんが、他の人が良い答えであることを知るための答えを探すのに役立ちます。 – Yahia

+0

良い点!私もその答えを受け入れました、チップYahiaのおかげで); – javipas

+0

:-)私の答えは – Yahia

答えて

1

使用(UPDATE#2)

SELECT 
a.a_datetm as 'October', 
IFNULL(p.a1,0) as 'Auth1', 
IFNULL(p.a2,0) as 'Auth2', 
IFNULL(p.a50,0) as 'Auth50' 
FROM 
(
SELECT CONCAT (day(X.a_date), '-1') AS a_datetm 
FROM all_date X 
WHERE X.a_date between '2011-10-01' and '2011-10-31' 
UNION ALL 
SELECT CONCAT (day(Y.a_date), '-2') AS a_datetm 
FROM all_date Y 
WHERE Y.a_date between '2011-10-01' and '2011-10-31' 
UNION ALL 
SELECT CONCAT (day(Z.a_date), '-3') AS a_datetm 
FROM all_date Z 
WHERE Z.a_date between '2011-10-01' and '2011-10-31' 
) a 
LEFT OUTER JOIN 
(
SELECT 
CONCAT (day(wp.post_date), (CASE WHEN (TIME(wp.post_date) < '14:31:00') THEN '-1' WHEN (TIME(wp.post_date) BETWEEN '14:31:00' AND '18:15:59') THEN '-2' ELSE '-3' END)) AS a_datetm, 
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 CONCAT (day(wp.post_date), (CASE WHEN (TIME(wp.post_date) < '14:31:00') THEN '-1' WHEN (TIME(wp.post_date) BETWEEN '14:31:00' AND '18:15:59') THEN '-2' ELSE '-3' END)) 
) p 
ON a.a_datetm = p.a_datetm 
ORDER BY a.a_datetm ASC; 
+0

Yahia、それはこのエラーを示しています:ERROR 1064(42000):あなたはあなたのSQL構文に誤りがあります。 'CASE'の近くの 'CASE'を 'October'として使用するにはMySQLサーバのバージョンに対応するマニュアルを確認してください。 IFNULL(t.a1,0)を 'Auth1'、 IFNULL(t.a2,0)を ' Auth2 '、 IFNULL' at line 1 エラーを検出しようとしましたが、解決策が見つかりませんでした:( – javipas

+0

@javipasここにMySQLはありませんが、上記の変更を試してください'END CASE'を' END'に変更しました) – Yahia

+0

Mmmm、今は動作しますが、元のクエリと同じものを表示します。これは出力です(ここでは簡単にhttp:// imgur。com/mRfow): +---------+-------+-------+--------+ | October | Auth1 | Auth2 | Auth50 | +---------+-------+-------+--------+ | 1-1 | 0 | 0 | 0 | | 10-1 | 5 | 0 | 9 | | 11-1 | 1 | 0 | 10 | | 12-1 | 0 | 0 | 4 | ... 最初の時間間隔(1-2,1-3,2-2,2-3など)は表示されず、これらの時間間隔のすべての投稿が含まれています。だから、カウントはうまく動作していません:( – javipas