2011-10-27 9 views
0

「MySQLの日付比較フィルタ」と題して、この件に関するStackOverflowに関する以前の質問がありました(このリンクを挿入することはできません)。 1。MySQLの日付/著者の比較

私はワードプレスのブログにいくつかの作者がいます。私はMySQLを通して生産性を得たいと思っています。次のクエリは、特定の時間帯のみ1日中、著者のポストを得るための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と行を削除したいです。

私はMySQLの専門家ではありませんが、これは多かれ少なかれ簡単に実行でき、クエリ結果(より正確にはクエリ結果の一部のフィールド)を表としてエクスポートできますか?

答えて

1

日付参照テーブルを作成し、そのテーブルにデータを入力してから、そのテーブルのLEFT OUTER JOINをクエリに追加する必要があります。 「欠けている日付をどのように表示するのか」の問題とにかく私はそれのために行くだろうかなりcommon SO questionです。日付参照表を作成します

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 - - 日付参照表を移入

use WordPress; 

ステップ1:mysqlのプロンプト実行時に

定量前ステップ

この表の考え方は、日付ごとに1つの行を持つことです。これで、insert文を実行することができますが、なぜなら、あなたのためにそれを設定するためのルーチンを書くのではないでしょうか(MySQL scheduled eventというイベントを作成すると、常にテーブルの日付が完全にセットされます。 :

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

10月のすべての日付を移入するには(またはちょうどあなたが好きにdays_into_the_futureパラメータをクランクアップ)

を今、あなたが持っている:

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 ; 

あなたは今実行することができます。日付refeあなたが人口にあなたが先に行くことができ、10月のためのクエリを実行して興味を持っているすべての日付とrenceテーブル:これは私たちに命じた記事のリストを与える:

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

すごく有望なTom Macに見えます。私は賛成です。私はMySQLの専門家ではありません...どうすれば実行できますか?一度mysqlプロンプトが表示されたら、コピーして貼り付けます。 申し訳ありません:( – javipas

+0

はい、あなただけのコードスニペットとしてそれらを実行する必要があります。それらのいずれかを実行する前にそれらを実行するスキーマを選択する必要があります。私はwp_postsとwp_postmetaはWordPressスキーマにあると思います。 ;上記のいずれかを実行する前に私は私の答えを編集します。 –

+0

Tom Mac、あなたのコードをテストしました。私のWordPressデータベースの名前でWordPressを使用しました(WordPressのブログで使用しているもの、o fコース)、あなたのコードを使用しようとした後( "WHERE p_posts.post_type = 'post'"は "WHERE wp_posts.post_type = 'post'"と読みます)、私はいくつかの結果を得ました。 実際、テーブルには私の著者と3つの列が表示されていますが、投稿件数は本当に高く、Auth1が94件の記事を公開し、Auth50が145件を公開していることは不可能です。 – javipas

1

私はあなたの全体の問合せをリライトしようが、ここでは、データのグループ化を行うだろうかだいないよ:各著者のための複数の列を作成

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

は、クエリの活用ではありません。そのような変換は、あなたのワードプレスのコードでうまくいきます。

このクエリは正確なクロック周期、1am、2am、3amなどで動作することに注意してください。任意の時間(1:05 am、2:05 am、3:05 am、etc ...)が必要な場合は、あなたはより複雑なグループ化が必要になります。

+0

私はそれが私が探していたものではありませんaffraidよそれは私がWordpressの投稿一覧に載せたものと同じです。それは著者と月によってフィルタリングすることができます。 – javipas

+0

私が言ったように、私はあなたの質問を書き直すつもりはありません。私は一度WPの腸を見て以来、これまでと同じではなかったので、私は実際のクエリが何であるべきかを理解するために再びそのデータベースを見るつもりはない。日付/時刻のグループ化の仕方を示すだけです。 –

+0

十分ですが、そのグループ分けは私が必要なものではありません。とにかくありがとう! – javipas

0

以下のクエリは、投稿者の投稿数をグループ化します。

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 

この意志出力テーブルのように:

例えばライン1のために意味
d m y post_author c 
------------------------------------ 
2 10 2011 50 23 
2 10 2011 51 12 
2 10 2011 52 6 

:2011年10月2日にID 50を持つ著者が23件の記事があります。最初に、テーブルのヘッダーを形成するために、配列内の著者をフェッチします。 PHPでこの結果を反復すると、それに応じてテーブルを生成することができます。

+0

メモを追加するだけです:特定の日に投稿者が投稿者がいない場合、その日は結果に表示されませんので、PHPでこのケースをカバーする必要があります。 –

+0

Nedret、ヒントありがとうございます:私はこのクエリをテストしましたが、期待した結果が得られていません。 COUNT(id)パラメータを間違えていませんか?私は、 "c"列の奇妙な値を取得します。 10月に公開されたすべての投稿が表示されていると思います。指定しようとする日と時間の範囲だけではありません。たとえば、27/10/2011では、著者 "50"のみが14:30から18:30まで3つの投稿を公開しました。私がクエリを実行すると、答えはOKですが、クエリを実行すると113個の投稿が表示されます... Strange :( – javipas