• ベストアンサー

[MYSQL] GROUP BY による結果レコードの取得について

こんにちは。 今回は MYSQL の GROUP BY によって、複数レコードのグループ化を行った場合についてお尋ねしたいです。 id, val という二つのフィールドをもつテーブルがあったとして、複数レコードに対して、id でグループ化を行うとします。 その時、val の合計を求めたいのですが、 SELECT id,SUM(val) FROM tablename GROUP BY id となる SQL構文により SUM(val) を取得します。 この場合、SUM(val) を降順にソートした結果レコードを得ることはできますでしょうか? 通常は ORDER BY を用いてこれを行うと思うのですが、このケースではよくわかりません。 また、PEAR によって、これらの結果レコードを連想配列で取得しようと思っています。 結果レコード $rs に対して、 $data = $rs->fetchRow(DB_FETCHMODE_ASSOC); とすると、 $data の連想配列のキーが SUM(val) となってしまいます。 変数に括弧が含まれるのは具合がよくないので、これらを回避する方法はありませんでしょうか? 以上2点おわかりの方がいればお答えいただけないでしょうか。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

SQLのほうだけ。 >この場合、SUM(val) を降順にソートした結果レコードを得ることはできますでしょうか? 序数で指定 SELECT id,SUM(val) FROM tablename GROUP BY id ORDER BY 2 desc

shu_a
質問者

お礼

検索によって詳しいマニュアルを見つけました。 PostgreSQL の方ですが、ようやく理解できました。 http://www.postgresql.jp/document/pg702doc/user/sql-select.htm ありがとうございました。

shu_a
質問者

補足

ありがとうございます。 降順にソートされた結果レコードを得ることができました。 一度、ORDER BY SUM(val) DESC といった方法で行ったのですが、できませんでした。 また HAVING も試しに用いてみたのですができませんでした。 この序数はどのようなケースで使うことができるのでしょうか?また、この数字は何を示しているのでしょうか。(単に2番目としか思いつかないのですが・・・) MYSQL のリファレンスを見たのですが、序数についての記述を探し当てることができませんでした。 加えて質問になりますが、教えていただけないでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • coco1
  • ベストアンサー率25% (323/1260)
回答No.1

as句ではダメでしたっけ? sum(val) as @@@

shu_a
質問者

お礼

ありがとうございました。 指定された方法で、置き換えができました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • プレインPHPでのSQL検索結果取得

    初心者の質問ですみません。 フレームワークをずうっと使って来たのですが、フレームワークを使わずに検索をしようとしたところ、全く思うようにいかず困っています。 SELECT * FROM table のような単純なSQL文なのですが、PEARを使って $sql = "SELECT * FROM table"; $result = $conn->query($sql); としvar_dumpしてみると、期待していたSQLのデータが表示されません。 フレームワークを使っていると、この時点でどのフレームワークでもきれいに連想配列で表示できていました。 その辺が、フレームワークのフレームワークたるゆえんなのでしょうか..... ただ、結果は取得できているようで、 $count = $result->numRows(); としてやると正しい件数が表示されますし、カラム名を指定して while($rs = $result->fetchRow(DB_FETCHMODE_ASSOC)){ echo $rs['column_name']; } としてやるとカラムの値を表示します。 やりたいこととしては、検索結果を連想配列で取得し、foreachで行ごとに処理を行うことで、whileで$rs['column_name']を取得できることから、最悪でも力技で行ごとにカラム情報を全て取得して配列を作ってやることはできるとは思うのですが、もっと良い方法が無いはずがないと思います。 教えていただけますでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • group by句

    以下のSQL文がoracle9iでOKで8iで通らないのですが、8iでも通るようになんとかできないでしょうか。 select a.val_Id, (select val_nm from tableA where val_id = a.val_id) as val_nm from tableA a group by a.val_id テーブルの内容 tableA( val_id number(1,0), val_code number(2,0), val_nm varchar(10) ) val_idとval_codeで一意となっています。 val_nmはval_idと一対一になっています。 要するにval_idに対応するval_nmも一緒に取得したいのですが、select句のサブクエリで8iの場合"group byの式ではありません"とおこられてしまいます。 ちなみに、今ここでは簡略化しているのですが本来は色なテーブルを結合しているので、単にgroup by val_id,val_nmとするのは無しでお願いいたします。 わかりにくいかとは思いますがお知恵をお貸しください。宜しくお願いいたします。

  • 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
  • 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
  • 集計の結果表示について

    初めまして。 いろんなアイテムと売れた個数を登録し、重複してるアイテム名はユニーク表示で、個数は合計値で結果表示させたいと思っています。 $sr="select sum(total) from テーブル名 where year group by item"; と記述し、$rs=mysql_query($sr)からnum_rows($rs)で件数を出し、$item=mysql_fetch_array($rs)としてレコード情報を配列で分割して、表示させようと思っています。 この方法ですとsum(total)しか結果表示されません。レコードの全ての結果を表示させるにはどういう記述があるでしょうか? わかりづらい質問ですみませんがよろしくお願いします。

    • ベストアンサー
    • PHP
  • DB_FETCHMODE_ASSOCの時、結合した二つのテーブルから同一名のカラムのレコードを連想配列で取得できないのか??

    よろしくお願いします。 $db =& DB::Connect($dsn, array()); $db->setFetchMode(DB_FETCHMODE_ASSOC); とし、 $res = $db->query("select A_t.ID, B_t.ID from A_t, B_t where A_t.NO = B_t.NO"); のようにsqlを発行した時、 while($row = $res->fetchrow()){ //..... } で、$rowに値を格納しようとしたのですが、 print $row[A_t.ID]; などとすると、 Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting ']' のようなエラーが出てしまいます。 $row[ID]; では、Aテーブルから取得したレコードなのかBテーブルから取得したレコードなのか判別できないのでダメだと思います。 $db->setFetchMode(DB_FETCHMODE_ORDERD); にした場合は、$row[0]、$row[1] の添字配列を使用することによって、AテーブルのIDカラムのレコードもBテーブルのIDカラムのレコードもprintすることが出来ましたが、 $db->setFetchMode(DB_FETCHMODE_ASSOC); では、上記のように結合した両テーブルに同一名のカラム名があると、 その同じ名前を持つカラムから連想配列にデータを渡すことは出来ないのでしょうか?? どなたか詳しい方いらっしゃったらご教授くださると幸いです。 よろしくお願いしますm(_ _)m

    • ベストアンサー
    • PHP
  • pear MDB2からレコードを配列で取得したい

    教えて頂けますか? 経験浅いのでわからないのですが、 pear MDB2からレコードを配列で取得したいのですが、 私が知っているfetchRowでは、一件ずつなので whileで回して配列に入れ直すのでしょうか? それとも配列として取得出来るメソッドがあるのでしょうか? どのようにするのでしょうか? 日本語マニュアルのありかが分からないので 教えて頂ければ助かります。 よろしくおねがいします。

    • ベストアンサー
    • MySQL
  • PEARでレコード数の取得

    レコード数の取得でPEAR_DBで $sql = 'SHOW COUNT(*) FROM XXX'; $res = $db->query($sql); $rocordcnt = $res->fetchRow(); したら Fatal error: Call to undefined method DB_Error::fetchRow() になりました。 $sql = 'SHOW * FROM XXX';だったら$rocordcntに最初にヒットしレコードが 配列で入るのですが、count(*) を得るにはどうしたらよいですか? 他の方法のありますが、勉強のために count(*) の結果の取得を教えて下さい。

    • ベストアンサー
    • MySQL
  • グループ毎にある列の最大値のレコードを取得する方法

    Accessで下記のようなテーブルでkeyフィールド毎のdayフィールドの最大値のレコードを取得したいと思ったのですが、keyフィールドとdayフィールドのみを表示する分には下記の記述で大丈夫かと思ったのですが、これにidフィールドとfieldフィールドもあわせて表示したい場合、どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 なお、出来れば同じkey,同じdayが複数あった場合、一番大きいid(主キー)のレコードを取得したいと思っています。 【テーブル(T_TBL)】 id|key|day|field ------------------ 1|1|     |100 2|2|2011/03/04|400 3|2|2011/03/03|500 4|3|2011/03/10|300 5|3|2011/03/10|200 【下記ソース実行時のメッセージボックスの表示結果】 1 : 2 : 2011/03/04 3 : 2011/03/10 【希望する表示結果】 1 : 1 : : 100 2 : 2 : 2011/03/04 : 400 5 : 3 : 2011/03/10 : 200 【ソース】 Option Compare Database Option Explicit Private Sub Form_Load() Dim db As DAO.Database Dim rs As DAO.Recordset Dim SQL As String Dim strMsg As String Set db = CurrentDb() SQL = "" SQL = SQL & "SELECT key, Max(day) AS max_day" SQL = SQL & " FROM T_TBL" SQL = SQL & " GROUP BY key" Set rs = db.OpenRecordset(SQL) Do Until rs.EOF strMsg = strMsg & vbNewLine & rs!Key & " : " & rs!max_day rs.MoveNext Loop MsgBox vbNewLine & strMsg rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub 以上、よろしくお願いします。

  • SQL GROUPで件数の一番多いレコードのみ取る

    SQL GROUPで件数の一番多いレコードのみ取る ORACLE10です。 次のようなテーブルがあります。 USER -----------テーブル名 ID,NAME,DATA----列名 1,A,any 1,A,any 1,B,any 2,C,any 3,D,any このテーブルから、IDをGROUPにして、さらに、一番使用頻度の多いNAMEを取得したいのです。 表示したいのは、IDとNAMEです。 つまり、取得結果例は次のようになります。 取得結果例 ID,NAME----列名 1,A 2,C 3,D SQL文をどのように作れば可能でしょうか? ちなみに、IDやNAMEのマスタテーブルはありません。 自分では、「(select ID, NAME, count(*) from USER group by ID, NAME) COUNT」で、COUNTを内部テーブルにして、グループ内で一番多いcount(*)をmaxで取得してみようかと思ったんですが、そこからアイデアが出ませんでした。

このQ&Aのポイント
  • 富士通FMVのFH56/HDにウィンドウズ10をインストールすることは可能です。
  • ウィンドウズ7からウィンドウズ10へのアップデートは推奨されます。FH56/HDは互換性があり、ウィンドウズ10の動作に対応しています。
  • アップデートを行うことで、ウィンドウズ10の新機能やセキュリティの向上によるメリットを享受することができます。
回答を見る