2011-01-17 12 views
4

私は40かそこらの行を持つテーブルがある - ここに小さなサンプルです:日付は1年かそこらの上に広がっている表示データは

ID Date   Name  apples 
1 1284497100 Brian  2 
2 1288126800 Tom  5 
3 1290268800 Kirsten 3 
4 1292274000 Emma  7 
5 1294174800 Sophie 1 
6 1299Lars  3

は、と私は希望してPHPを持つことですページの各月に私の最もリンゴと2人を示す:

1月:
名1
Name2は

2月:
名1
Name2は

これを実行するための簡単な方法があります場合、私は思っていた、または私は私が取ると仮定した(各月の12種類のmysql-コードを作成する必要がある場合それは、サーバー上の通行料だ - 私は右だ)

+0

なぜあなたは代わりに 'DATETIME'の' date'列のためのUNIXタイムスタンプを使用していますか? – webbiedave

+0

こんにちはデイブ、正直言って、私はもう覚えていません。何らかの理由がありましたが、私は忘れました。 – Brian

答えて

2

最も簡単な方法:

SELECT 
    EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(`Date`)) AS year_mo, 
    `Name` AS name, 
    SUM(`Apples`) AS sum_apples 
FROM apples_table 
GROUP BY 1,2 
ORDER BY 1,3 DESC; 

おそらくSTにDATETIMEカラムを使用すべきですか?あなたの日付は変更できますが、FROM_UNIXTIME()関数を使用して、EXTRACTで使用する値を変換することができます。詳細は、MySQL date/time functions documentationを参照してください。

このクエリは、同じ月に何回連続して何回連続して追跡し、必要に応じて行を破棄するかによって結果を読み取るPHPループで処理する、月に2つ以上の行を提供します。これは、12の個別のクエリを使用するよりも、問題を処理するための方がはるかに良い方法だと思います。

あなたのテーブルには40行しかありませんが、本当に悪いことをしない限り、パフォーマンスは問題にはなりません。

正確に1つのクエリで必要な結果を返すために必要な秘訣のSQL構文を掘り下げたい場合は、this articleをご覧ください。このようにして、ネクタイやその他のエッジケースを処理するのは難しいでしょう。


編集 - ここではPHPコードの考えです:

$query = mysql_query(<<<SQL 
    SELECT 
    EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(`Date`)) AS year_mo, 
    `Name` AS name, 
    SUM(`Apples`) AS sum_apples 
    FROM apples_table 
    GROUP BY 1,2 
    ORDER BY 1,3 DESC; 
SQL 
) or die(mysql_error()); 

$last_year_mo = ''; 
$same_date_count = 0; 
while ($row = mysql_fetch_assoc($query)) { 
    # Only process 2 rows for each date 
    if ($row['year_mo'] == $last_year_mo) { 
    if (++$same_date_count >= 2) { 
     continue; 
    } 
    } else { 
    $last_year_mo = $row['year_mo']; 
    $same_date_count = 0; 
    # Spit out some HTML if needed, like a separator 
    } 

    # year_mo is a string in the form YYYYMM 
    $year = substr($row['year_mo'], 0, 4); 
    $month = date('F', mktime(0, 0, 0, substr($row['year_mo'], 4, 2), 1)); 

    # Spit out some HTML for this row 
} 
+0

彼は 'Date'に' DATETIME'型を使用せず、むしろ整数です。 – webbiedave

+0

これに応じて編集されます。 – jnylen

+0

こんにちはjnylen、私はあなたがPHPを含むコード全体がどのように見えるかを私に見せてくれるとは思わない?私はそれをOPで自分の例のように見せてもらえません。 – Brian