• ベストアンサー
  • 困ってます

1回のSQLで集計結果順にソートする方法を教えてください

PHP4+MySQLです。 やりたいことがあるのですが、いいSQLが考えつきません。 お知恵を拝借できれば幸いです。 以下のようなテーブルがあるとします。 ID|ITEMid|DATE 1| 232|2009-06-14 2| 156|2009-06-14 3| 156|2009-06-14 4| 232|2009-06-14 5| 232|2009-06-14 6| 567|2009-06-14 これを次のように集計したいのです。 (ITEMidの登場回数順にソートして、実際の回数も出す) 232:3 156:2 567:1 サブクエリの使えない環境で、1回のSQLで集計することはできるでしょうか。できる場合実際のSQL文を教えていただければ幸いです。 テンポラリテーブル使えば自分でもできそうな気がするので、できれば使わない想定でお願いします。

共感・応援の気持ちを伝えよう!

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

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

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

SELECT ITEMid, count( ITEMid ) AS itemcount FROM テーブル名 GROUP BY ITEMid ORDER BY itemcount DESC

共感・感謝の気持ちを伝えよう!

質問者からのお礼

すごい、完璧です。 すぐに回答いただけて、めちゃくちゃ助かりました。 大変ありがとうございました!!

関連するQ&A

  • ソート順の一番若い者を取得する

    お世話になります。 Oracle SQL文で質問があります 以下のようなテーブルから【結果】のような レコードを取得したいのです id id2 が同じものでsort順が一番若いものを 取り出すSQLです。 おわかりの方よろしくお願いします。 id id2 sort 1 1 1 1 1 2 1 2 1 1 2 2 1 2 3 1 3 1 【結果】 id id2 sort 1 1 1 1 2 1 1 3 1

  • 集計のSQL文について

    SQLでの集計方法について質問です。 Oracle8iを使用しています。 あるテーブルに以下のようなレコードがあります。 ID 回数 値 1   1  100 1   2  200 1   3  300 2   1  150 2   2  550 .... この登録されている値をそのIDごとに、その回数まで回数ごとにサマリーした結果を出力したいのですが どうすればよいでしょうか。 ID 回数 値 1   1  100  ・・・(100) 1   2  300  ・・・(100+200) 1   3  600  ・・・(100+200+300) 2   1  150  ・・・(150) 2   2  700  ・・・(150+550) 宜しくお願いします

  • サブクエリなしで2つのテーブルを集計する方法

    テーブルA id|cnt|name 1 2 田中さん 2 5 鈴木さん テーブルB id|cnt|name 1 4 田中さん 2 4 鈴木さん サブクエリを使用せず、上記2つのテーブルを集計し、 下記のように出力できるSQLはありますでしょうか? ■期待する総合ランキング結果 id|cnt|name 2 9 鈴木さん 1 4 田中さん P.S まだまだ、安価なレンタルサーバはMySQLは4.0が多く苦労します・・

    • ベストアンサー
    • MySQL
  • アンケート結果を集計するSQLを教えて下さい

    アンケート結果を集計する効率の良いシンプルなSQLを教えて下さい。 MySQLで、以下の状態です。 テーブル名:hoge カラム:id,kbn id...auto kbn...1~5 欲しい結果は、以下の状態です。 順位,kbn,count 1位,5,60ポイント 2位,3,45ポイント 2位,1,45ポイント 4位,4,30ポイント 5位,2,10ポイント ※位やポイントはプログラム側で付与するので不要です。 2位の様に同点の場合は同じ順位を表示し、3位を飛ばし順位を表示させたく思います。 どうぞ、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • GROUP BYによる集計後のソートの高速化にアイデアはないでしょうか?

    ウェブサービスはいろいろ作ったことはあるのですが、分析系は作ったことがなく、DB構造について悩んでるところであります。 現在の課題は、商品ごとの売り上げ集計後に、それをランキング表示して表示する、というところなんですが、 select 商品ID,SUM(売り上げ)as`sales` from 売り上げテーブル group by 商品ID order by sales DESC limit 0,30 というものですが、やはり sales にインデックスが使えないのでtemporary table と file sort がでてきて遅くなってしまいます。 order by をはずすとやはり高速にレスポンスは返ってきます。 日別、月別、などのサマリーテーブルは作ってはいるのですが、単月ではなく、複数月指定での集計だとサマリーはないので集計をしないといけなくなります。 基本的なことなんだと思いますが、諸先輩方はどういったやり方で解決されておられるのでしょうか? なお、試験段階の現在は、売り上げテーブルには400万件、商品データは6万件あります。ですので、order by をはずした場合、6万件ほどがヒットし、それを(file sortで)並び替えてる状態だと思います。

  • カテゴリと個別商品の集計SQLについて

    カテゴリと個別商品の集計SQLについて質問です。 postgresのバージョンは9.0です。 次のテーブルより ------------------------------------------ id  カテゴリ  商品名    日付       値 ------------------------------------------ 1  野菜    ホウレン草  2010-01-01  100 2  野菜    ホウレン草  2010-01-02  100 3  野菜    ホウレン草  2010-02-02  100 4  野菜    キャベツ    2010-01-02  200 5  肉      牛肉      2010-01-01  500 6  肉      牛肉      2010-01-02  500 -------------------------------------------- 下の結果を得るSQLを考えています。 月毎の値の集計 カテゴリ  商品名     1月  2月    合計   カテゴリ合計  カテゴリ合計と合計との差 ----------------------------------------------------------------------------- 野菜    ホウレン草   200  100    300    500        200 野菜    キャベツ     200    0    200    500        300 肉      牛肉      1000   0    1000   1000         0 ----------------------------------------------------------------------------- ここでカテゴリの合計とは 上の場合、 ホウレン草(300)+キャベツ(200)=カテゴリ野菜(500)、です。 クロス集計とサブクエリを使えば出来そうなのですが、カテゴリ合計を出す部分の SQLが思いつきません、よろしくお願い致します。

  • SQL複数テーブル間でのソート

    お世話になります、プログラム初心者です。 SQL + PHPでデータを必要条件でまとめてテーブル表示させ、ソートが出来るようなページを作成しています。 具体的には保険のプランやサービス内容、特約などの全体の情報が入ったテーブルがあり、そこからヒモつけられた別テーブルに年齢性別別の料金の表があります。 「男性」「女性」や「終身」「定期」等の条件による情報の収集は出来るようになったのですが、並び替えのところでつまずいております。 例えば「保険料の安い順」に並び替えようとすると各料金表のテーブルから持ってきた年齢性別などの条件に合わせた料金を比較しなければならないので2段階の動きとなりうまくいきません。 一つのテーブルであればSQLに「ORDER BY 」等の指定で出来るのですが、複数にまたがっている為、どのような考え方で進めればいいのか、また具体的にどのような方法があるのか。どなたかご教授頂けないでしょうか。

    • 締切済み
    • PHP
  • PL/SQLでの集計とテーブルの結合の仕方

    いつもお世話になっております。 pl/sqlでの処理なのですが、タイトルのとおり テーブルの結合と集計で分からないところがあり、 こちらで質問させていただきました。 処理内容は あるグループでレコードを集計し、 そのグループが重複する他のテーブルと結合したいと 考えております。 【テーブル1】 (班) (回数) (秒) aaa| 10| 100 aaa| 20| 200 bbb| 10| 150 bbb| 20| 100 ccc| 10| 100 ccc| 30| 250 : : : まずこれを集計し、件数を追加して (班) (回数) (秒) (件) aaa| 30| 300| 2 bbb| 30| 250| 2 ccc| 40| 350| 2 : : : : というようにまとめ、 【テーブル2】 (年月) (班) (円) 200904| aaa| 1000 200905| bbb| 1500 200904| ccc| 2000 : : : というテーブルと結合して (年月) (班) (回数) (秒) (円×件) 200904| aaa| 30| 300| 2000 200905| bbb| 30| 250| 3000 200904| ccc| 40| 350| 4000 : : : : : という形にしたいのですが可能でしょうか? 例に挙げたのは3件しかありませんが テストデータは1万件以上ありそれを処理します。 初心者なので、テーブルの結合の仕方、 集計の仕方が分からず行き詰っております。 どなたか、お力を貸していただけないでしょうか。 よろしくお願いいたします。

  • 検索結果の再ソートを試みる。

    項番 商品番号 生産日 賞味期限 A B C D E 1 1 200407 200507 2 1 200307 200407 3 2 200404 200504 4 3 200406 200407 5 3 200405 200406 6 3 200404 200405 上記のテーブルがあったとして、以下の処理を実現するSQLを考えます。 1. 上記のものを、商品番号の昇順・生産日の降順(最新)でソートし、 商品番号毎に生産日が最新のものを抽出します (期待される結果:項番3、4、1の順で3つ抽出) 2. 取得したのを賞味期限の昇順にソートします ※項目は、項番商品番号生産日賞味期限の他にもABCDE……と存在するものとします。 カーソルオープン時に上記1、2を満たす事が条件です。 上記SQLの記述について、どなたか助言おねがいします。

  • 複数列でのソート

    MySQL4.0で、2つのカラムを比較してソートをしたいと考えています。 cat dog ================== 3   12 ------------> 3 5 2 ------------> 2 7 15 ------------> 7 16 9 ------------> 9 というテーブルがあり、cat列もしくはdog列を比較してどちらか小さい値をキーにしてソートさせたいのです。 上の例だとこんな感じに結果を得たいのですが。。。。 cat dog ================== 5 2 ------------> 2 3 12 ------------> 3 7 15 ------------> 7 16 9 ------------> 9 一度結果セットを配列にいれて、プログラム側で再度ソートをかけようかなと思っていたのですが、できればSQLの側でできないものかと考えています。4.1以降であれば、サブクエリを使ってなんとかできそうなのですが、4.0なので方法がぜんぜん思い浮かびません。どのようにSQLを書けばいいのでしょうか??

    • ベストアンサー
    • MySQL