MySqlでGROUP BYの使い方とは?

このQ&Aのポイント
  • MySqlでGROUP BYを使用すると、指定したカラムの値ごとにグループ化し、それぞれのグループに対して集計処理を行うことができます。
  • 例えば、カラムtext_dateの時間部分(8・9番目の数字)ごとにデータをグループ化し、それぞれのグループの件数を取得することができます。
  • 具体的なクエリは、SELECT text_date, count(*) FROM 来店table WHERE text_date >= "20120101010101" GROUP BY SUBSTR(text_date, 9, 2) のようになります。
回答を見る
  • ベストアンサー

GROUP BY の指定で

MySqlには不慣れな者です。 来店table id|text_date |name 1 |20120101010101|山田 2 |20120222001227|鈴木 3 |20120309035932|福田 4 |20120309035932|館山 5 |20120713121211|大沢 6 |20120822120127|矢島 といったテーブルがあるとします。 カラムtext_dateはCHARで、日時データを持っています。 (ちょっと解り辛いサンプルで失敬) SELECT text_date, count(*) FROM 来店table WHERE text_date >= "20120101010101" GROUP BY text_date; とするとid 3・4の同日時のみカウント2として以外はカウント1で出ると思います。 希望ですが、カラムtext_dateの時間部(8・9番目の数字)でカウントを取りたいのですが。 GROUP BY の指定方法でそのような事はできるのでしょうか? MySqlのリファレンスを色々探し回っているのですが、見つけることができません。 ご助力いただけると助かります。

  • MySQL
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

GROUP BY SUBSTRING(text_date, 8, 2)

hige_mario
質問者

お礼

SUBSTRINGで希望とおりの結果を得られるようになりました。 とっても感謝です。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

頻度が高いのであれば最初から別カラムに専用でとっておき インデックスを貼っておくことです

hige_mario
質問者

お礼

ご提案ありがとうございます。 ご指摘とおりだと思うのですが、実際のテーブルがすでにかなりのレコード数になっていたりで、どう管理すべきか悩み中な感じなんです。 ^-^

関連するQ&A

  • group byを使う時に条件をつけたいです。

    どう頑張っても思いどうりにDBからデータがとれず困ってます... 例えばこんなテーブルがあったら(テーブル名が"test"、カラムが"name"と"id") table test name | id ---------- aa | 1 aa | 1 aa | 1 bb | 1 bb | 1 aa | 0 aa | 0 cc | 0 カラム"id"が0の時は、カラム"name"のgroup byせず カラム"id"が1の時だけ、カラム"name"のgroup byするには、どうすればいいのでしょう? このような感じにデータを取り出したいのです。 name | id  | COUNT ---------- aa | 1 | 3 bb | 1 | 2 aa | 0 | 1 aa | 0 | 1 cc | 0 | 1 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MYSQLでgroup by を教えてください。

    まだ初心者なんです。よろしくお願いいたします。 テーブル$tbl_nameに日付date コラムに (2009-11-3 14:25:06).(2009-11-3 11:25:06). (2009-11-5 12:25:06).(... ....と年齢 ageコラムに (18)(19)(20)... 性別コラムage に (danshi)(jyoshi) が入っています。 これを日付別 に内容が存在するだけ出力したいのです。 出力内容は(18)→25、(19)→13、(20)→7、の数だけ、 同様に(danshi)→20、(jyoshi)→25、というように 〇月〇日18才は25人、19才は13人、20才は7人、 男子は20人、女子は25人と出したいのです。 $sql = "SELECT 'age',count(age) FROM $tbl_name group by 'date'"; $result = mysql_query($sql, $db) or die("クエリの送信に失敗しました。<br />SQL:".$sql); while ($row = mysql_fetch_assoc($result)){ $age .=$row;} 等記入しているのですが、何とも動きませんのです。 どうしたらよろしいものでしょう。よろしくお願いいたします。

  • group by とhaving

    こんにちは。 グループ化した後に条件で摘出する方法について教えて頂けますでしょうか。 例えば、以下のようなテーブルを作ったとして、 テーブル id tag_no 1 5 1 6 1 7 1 8 1 9 2 5 2 10 2 11 3 5 3 9 3 10 指定したtag_noを持つidを摘出したいのですが、tagnoを複数指定するのにはどのようにしたらよいのでしょうか・・・。 select table from group by id having tag_no = 5 and tag_no = 9; として、 idの1と2を取り出す・・・といったことをやりたいのですが、 実際にやってみるとempty setとなります。 このテーブルで無理ならテーブルの変更もありなのですが、 一晩悩んでも思い浮かばず・・・。 mysqlはvar5.5です。 お力添えをよろしくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • SQLのcount()とgroup by

    以下のようなテーブルがあったとき、 tbl1 id | score 1 | 100 1 | 200 1 | 300 2 | 200 2 | 100 3 | 300 3 | 400 3 | 500 3 | 600 idでまとめて個数を出すとすると、 SELECT count(*) FROM tbl1 group by id とすれば count(*) 3 2 4 と結果が返ってきますが、この結果にidを足して id | count(*) 1 | 3 2 | 2 3 | 4 というようなSQLはどうやって書けばいいのでしょうか? MySQLでは、 SELECT id, count(*) FROM tbl1 group by id と書けるのですが、これは標準的なSQLではNGなそうなので、気になって質問しました。 よろしくお願いします。

  • group by のソート

    mysql Client API version 3.23.49 PHP/4.4.5 で動作させようと思っています。 table a   b 1   2 3   4 2   4 7   1 2   6 1   6 上のデータから以下のような結果を得たいのですが table a   b  idcount1 1   6    2 3   4    1 2   6    2 7   1    1 グループで集計をとり、その上でbに6がある場合は6その他は bの値にNULLもしくは別の値が入るという形でいいのですが・・・ できません。 SELECT a, b, count( * ) AS idcount1 FROM table GROUP BY a するとはじめに読みこんだ値がbには入ってしまいます。 結果 table a   b  idcount1 1   2    2 3   4    1 2   4    2 7   1    1 SELECT a, b, count( * ) AS idcount1 FROM table where b=6 GROUP BY a するとbの値ははじきますし、カウントしている意味がなくなります。 結果 table a   b  idcount1 1   6    1 2   6    1 GROUP BY 処理前のソートを考え、from table後に oder by b=6 asc を使ったがエラー 末尾に oder by b=6 asc を使うと最初に試した値をソートするだけでした。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • GROUP BY/ORDER BYの併用で期待するORDERが得られま

    GROUP BY/ORDER BYの併用で期待するORDERが得られません。 データベース初心者です。よろしくお願いいたします。 table id group_id name 1 1 冷蔵庫1 2 2 カメラ1 3 2 カメラ2 4 2 カメラ3 5 3 テレビ1 のようなテーブルを、group_idでグループ化し、idの大きい順に並べた以下のようなデータ id group_id name 5 3 テレビ1 4 2 カメラ3 1 1 冷蔵庫1 を取得しようとして悩んでおります。 SELECT MAX(id) AS max_id, id, group_id, name FROM table GROUP BY group_id ORDER BY max_id DESC というクエリですと max_id id group_id name 5 5 3 テレビ1 4 x 2 y 1 1 1 冷蔵庫1 という結果が得られますが、xとyところが、期待するx=4、y=カメラ3とならないケースがあります。 いくつかのテーブルで試しましたが、期待する結果になるものとならないものがありました。 例えばこれを自己結合することも考えたのですが、WHERE句にASで命名した「max_id」が含まれると「max_idが不明」というエラーが出ます。 MySQLのバージョンは4.0.xでして、サブクエリーが使えません。 このような状況で、何か方法がございましたらご教授のほどお願い申し上げます。 「期待する結果がクエリ1回で得られない」ということを知れるだけでも構いません。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 特定の列だけをGROUP BYしたい時

    いつもお世話になっております。 ID列をGROUP BYしてCOUNTしたいのですが 氏名列に入っている値がバラバラなので GROUP BYで思う様に出来ない状態です。 条件から氏名列を外すと当然無効と言われます、 どのように回避すればうまく行くのでしょうか? SELECT 氏名列,ID列,COUNT(カウント列) FROM テーブルA WHERE ID列 IN (1,2,3) GROUP BY ID列,氏名列

  • group byで最後のレコードを抽出したい

    group byで特定のカラムをまとめる際に、最後(最新)のレコードを抽出したいのですが 最初(古い)の行が抽出されてしまいます。 例えば、threadカラムとuptimeカラムがあるテーブルBBSで threadカラムをgroup byでまとめる際にuptimeの降順(desc)でまとめたい場合 どのようにしたらいいでしょうか? 【テーブルBBS】 id thread uptime 1 1 1230100000 2 2 1230200000 3 1 1230300000 4 3 1230400000 5 1 1230500000 6 2 1230600000 select * form bbs group by thread order by uptime desc だと thread uptime 3 1230400000 1 1230300000 2 1230200000 になってしまいます。 次のような結果を表示するにはどのようにしたらいいでしょうか。 thread uptime 2 1230600000 1 1230500000 3 1230400000 また、DISTINCTを使うと同じフィールド内に重複したレコードがある場合は最初のレコードのみ表示されますが、最後のレコードのみ表示するにはどのようにすればいいのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • GROUP BYで集約されるときのソートを変えたい

    GROUP BYで集約されるときのソートを変えたい MySQLの5.1を使用しています。 テーブル"tbl"には、"no","id","score"の3つのフィールドがあり、 "no"は主キーです。 +---+----+-------+ | no | id | score | +---+----+-------+ | 1 | 10 | 10002 | | 2 | 10 | 10000 | | 3 | 10 | 10008 | | 4 | 11 | 10004 | | 5 | 12 | 10006 | +---+----+-------+ 上記の表から、 scoreの値が高い順にグループ化してソートしたいのですが、 以下のSQL文ではscoreが最初に登録されたものに集約されてからグループ化されてソートしてしまうため、 思い通りの結果が得られずに困っています。 ↓具体例 SELECT no, id, score FROM tbl ORDER BY score DESC GROUP BY id; +---+----+-------+ | no | id | score | +---+----+-------+ | 5 | 12 | 10006 | | 4 | 11 | 10004 | | 1 | 10 | 10002 | +---+----+-------+ ↓欲しいソート順 +---+----+-------+ | no | id | score | +---+----+-------+ | 3 | 10 | 10008 | | 5 | 12 | 10006 | | 4 | 11 | 10004 | +---+----+-------+ テンポラリテーブルはなるべく使用せずソートしたいのですが、 このような事は可能なのでしょうか? ご存知の方がいらっしゃいましたら教えていただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLのgroup byの選択基準

    お世話になります。質問がふたつあります。 このような、IDとTypeのふたつのカラムで重複しているレコードが多いテーブル「tb」があるとします。 ID Type age 1 1 20 1 2 35 1 3 42 1 2 31 1 3 45 1 2 33 2 1 21 2 3 41 2 1 26 2 2 31 2 1 25 2 1 28 これを、以下のようにしたいのです。 ID Type age 1 1 20 1 2 35 1 3 42 2 1 21 2 2 31 2 3 41 group by ID, Typeとしたところ、 似たような形にはなったのですが、IDとTypeが重複した ID Type age 1 2 35 1 2 31 1 2 33 のうち、group byによってどのような基準でひとつが選択されるのでしょうか? レコードの追加が新しいものが選ばれるのでしょうか? また、ageをランダムでひとつを選択するような書き方はできるのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • MySQL