SQLクエリに関する質問

WBOY
WBOYオリジナル
2016-06-23 14:01:05988ブラウズ

テーブルグループがあり、その下には多くのフィールドがあります
ID
ユーザー
コスト
タイプ
addtime
uptime
note
.....

type には 5 つのタイプがあります、つまり 001-005、
私が欲しいもの結果は、過去 6 か月間の 001-005 の合計数をクエリします。
たとえば、1 月 1 日から 31 日までのデータをクエリします。TYPE は 001-005 です
select count(*) from groups where type=' 001' および addtimefa5c87cec7df187558e986b99fd5226a= '20130330' のグループから
type='004' および addtime452f85ba0cd27d8ca8f57aa25d2442f9= '20130530'
6 か月間クエリを実行する場合、30 回クエリを実行する必要があります。
このシステムにログインしている人が多い場合、このような SQL のクエリは非常に時間がかかります。3 人が同時にこのページを開いた場合の応答時間は約 3 秒以上になるかどうかを試してみました。これらのクエリ結果をテーブルに書き込む方法があります。クエリを実行するときに、テーブルのデータを直接クエリし、これらの SQL データが自動的に結果をクエリしてテーブルに更新する時間を設定できます。この方法では、count クエリを使用するよりもテーブルから直接データをクエリする方が高速ですが、これをどのように実装すればよいでしょうか? 私が現在使用しているのは、1 つずつクエリを実行する最も愚かな
メソッドであり、非常に行き詰まっています。

ディスカッションに返信 (解決策)

select count(*) from groups where type in('001','002','003','004','005') and addtime>='20130101 ' and addtime 1a72f831e1093772243d19fd23f88d89='20130101' そしてaddtime <= '20130630'

こんにちは、ご返信ありがとうございます。この方法では、クエリは合計値になります
たとえば、1 月の TYPE =001 の場合、合計は 20 になります。 1 月の合計は 500 です
TYPE =003 1 月の合計は 3987 です
TYPE=004 1 月の合計は 9898 です
TYPE=005 1 月の合計は 123 です

select count(*) from groups where addtime>='20130101' and addtime <= '20130630' group by addtime,type

select type, left(addtime,6) as addtime 、 count(*) as cnt from groups group by 1, 2

そうすれば、group by type、DATE_FORMAT(addtime,'m%') も必要ありません これを試してください

select count(*) from groups where addtime>='20130101' and addtime <= '20130630' group by MONTH(addtime),type

select count(*) from groups where addtime>='20130101' and addtime <= '20130630' group by substring(addtime,4,2),type

2 つの方法:

1. SQL を使用して一時テーブルを作成します

2. where 条件に関連するインデックスを作成します


一時テーブルは良い選択であり、データが処理された後に自動的に解放されます。

group by+1 を使用してください

書き方を自分で勉強してください

クエリを減らすためにキャッシュを使用することは実際には不可能です...

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。