2012-03-06 6 views
0

MYSQLに問題があります。下記のコードは、1〜2週間前まではうまくいきました。最初のエントリーは2011年9月18日でしたので、1年連続で実施されていません。weekofyearのMYSQLグループは動作を停止しました

私がこのクエリで達成したいのは、毎週発生したエントリの数を取得することです。

私は、PHPでUNIXスタンプを処理して、その年の週番号を取得し、その統計情報に12ヶ月以上働くことを許可する年を付けるようにします。

質問です - どこが間違っていますか?なぜそれがw/cの作業を停止したのですか2012年2月21日?

答えて

2

問題は、選択しているフィールドとは異なるフィールドセットでグループ化していることです。そのクエリはちょうど偶然によって働いています。つまり、あなたはWEEKOFYEARでグループ分けし、時間値を選択しています。グループ化が実際に行うことは、詳細を「削除」し、それらに機能(この場合はカウント)を適用するグループを作成することです。

これで、同時にグループ化しながら詳細を表示しようとしています。その結果、誤ったクエリが発生します。例えば、これは動作しますが、あなたに詳細が表示されません。

SELECT dept, WEEKOFYEAR(DATE(FROM_UNIXTIME(time))) as aWeek, COUNT(*) AS freq 
FROM prefix_table1 a 
INNER JOIN prefix_table2 b b ON a.author = b.username 
GROUP BY dept, aWeek 
ORDER BY aWeek 
LIMIT 24 

あなたの元のクエリの間違ったロジックの明確な例がある:あなたがグループ化されている場合は、(カウントがなり、のは言わせて20本の記録ディスプレイ20)...あなたはそれらのレコードの1つだけを表示することができる場合、それらのすべての時間を表示しますか?

編集:@ypercubeが言ったように

は、前のクエリを使用すると、ANSIの規格かどうかを尊重するために、サーバーを強制している場合によっては動作しない場合があります。その場合、次のクエリを実行してみてください。

SELECT dept, WEEKOFYEAR(DATE(FROM_UNIXTIME(time))) as aWeek, COUNT(*) AS freq 
FROM prefix_table1 a 
INNER JOIN prefix_table2 b b ON a.author = b.username 
GROUP BY dept, WEEKOFYEAR(DATE(FROM_UNIXTIME(time))) 
ORDER BY aWeek 
LIMIT 24 
+0

これは有効なSQLではありません(MySQLでも動作する可能性はありますが)。あなたは 'WHERE'節、' SELECT'リストで定義されたエイリアスで使うべきではありません。 –

+0

いいえ、 'WHERE'節でエイリアスを使用することはできません。私は 'GROUP BY'でそれを使用しています。これはMySQLで有効です。 –

+0

今はテストできませんが、(厳密な)ANSI MODEが設定されていない場合にのみ実行される可能性があります。おそらくあなたはあなたの答えにそれを加えるべきです。 –

関連する問題