最も簡単な方法:
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
}
なぜあなたは代わりに 'DATETIME'の' date'列のためのUNIXタイムスタンプを使用していますか? – webbiedave
こんにちはデイブ、正直言って、私はもう覚えていません。何らかの理由がありましたが、私は忘れました。 – Brian