• ベストアンサー
  • すぐに回答を!

SQLでグループ化して降順表示がうまくいきません

個人的にMysql、php環境でサイトを作っております。 そこで、素人質問で申し訳ありませんが、SQLでお伺いしたい点があります。 例えば下のようなテーブルがあります。 ▽果物テーブル 果物ID | 果物名 | 売れた日付 1 | リンゴ | 2008/11/1 2 | みかん | 2008/11/2 3 | みかん | 2008/11/3 4 | リンゴ | 2008/11/4 これを、 『最近売れた』果物順に、『グループ化』して並べ替えたいと思い、 下記のようなsqlを組みました。 $sql = "SELECT 果物名, FROM 果物テーブル GROUP BY 果物名 ORDER BY 売れた日付 DESC"; 意図としてはリンゴ、みかんの順に並べ替えたいのですが、 みかん、リンゴの順に表示されてしまいます。 想像では、グループ化したとき、古い日付の方が残ってしまい、 | リンゴ | 2008/11/1 | みかん | 2008/11/2 この部分を対象にして日付を降順にしてしまうからだと思うのですが、 これをうまく解決する方法が分かりません。 MSアクセスなどですと先に二重にクエリをかけるなどすることで 「先に降順で並べ替えたクエリを出し、その後グループ化させる」 など処理が簡単なのですが、phpではどうするのかいまひとつ分からず・・・ 申し訳ありませんがよろしくお願いします。

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

  • 回答数2
  • 閲覧数386
  • ありがとう数2

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

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

>『最近売れた』果物順 でしたら日付のMAXを拾ってみては? SELECT 果物名,MAX(売れた日付) AS 売れた日付 FROM 果物テーブル GROUP BY 果物名 ORDER BY 売れた日付 DESC

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

質問者からのお礼

ありがとうございます。 解決しました。 このような出し方があるのですね。勉強になりました。

関連するQ&A

  • 結果を横に表示するSQLを教えてください

    SQL初心者です。 以下のような縦に表示されるクエリを横向きに表示する際のクエリを教えて頂けないでしょうか。 現在のクエリ結果 日付   種類   合計 4月1日 りんご 10 4月1日 みかん 20 4月2日 みかん 15 4月2日 りんご 30 4月3日 みかん 40 4月3日 りんご 5 ※クエリ詳細 select 日付,種類, sum (数量) as 合計 from テストテーブル group by 日付,種類 order by 日付 ※元データ 元データ 日付   種類   数量 4月1日 りんご 5 4月1日 りんご 2 4月1日 りんご 3 4月1日 みかん 10 4月1日 みかん 3 4月1日 みかん 7 上記を以下のような結果にしたいです。 種類  4月1日 4月2日 4月3日 りんご 10   30   5 みかん 20   15   40 わかりにくい説明で申し訳ございません。 どなたかご回答頂ければ幸いです。 よろしくお願い致します。

  • 並替にてSQL文を優先させたい

    テーブル1には 番号フィールド 001 002 003 が入力されています。 選択クエリで SELECT テーブル1.番号 FROM テーブル1 ORDER BY テーブル1.番号; というSQL文でクエリ1を作成しました。 クエリ1を開くと 番号 001 002 003 となります。 ここでクエリ1をダブルクリックで開き、 右クリック→降順で並替をすると 003 002 001 に並び変わります。 このまま保存し、再度クエリ1を開くと降順のままです。 SQL文の並び替え順は無視されるのでしょうか?

  • Acess2003で複雑なSQL?

    Access2003で以下のSQLを実行させることはできるのでしょうか? 直接SQLで実行する方法と、Access独特の両方で実行する方法が知りたいです。 select name, count(*) from テーブル group by name order by 2 desc;

その他の回答 (1)

  • 回答No.2
  • koke29
  • ベストアンサー率58% (114/196)

SELECTの売れた日を max(売れた日) as day で order by day DESC にすると最新日付のデータでソートできました $sql = " SELECT 果物名,max(売れた日) as day FROM 果物テーブル GROUP BY 果物名 ORDER BY day DESC "; as の後は任意なので適当に付けて下さい

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

質問者からのお礼

ありがとうございます。 max、勉強になりました!

関連するQ&A

  • SQLのsum関数

    こんにちは。 PostgresのSQLが思うように動いてくれません!! そのIDを持っている人がどのくらいの数を持っているのかを抽出したいのです。 テーブルは下記です。 ********************************************* ★Aテーブル ID  名前  数  場所  日付 0001 みかん 1  冷蔵庫 0901 0001 みかん 4  倉庫  0901 0001 みかん 1  冷蔵庫 0901 0002 いちご 1  部屋  0901 0002 いちご 2  部屋  0801 0003 きのこ 6  倉庫  0901 ★Bテーブル ID  名前 0001 みかん 0002 いちご 0003 きのこ 0004 あいす ********************************************* となっている場合、下記SQLを実行すると select a.ID ,b.名前 ,sum(a.数) as 数 from Aテーブル a,Bテーブル b where a.日付 >= '0901' and a.日付 <= '0901' and a.ID = b.ID group by a.ID ,b.名前, a.数 結果が 0001 みかん 2 0001 みかん 4 0002 いちご 1 0002 いちご 2 となり0001は合計6で出て欲しいのに別々に出てしまいます。 理想では 0001 みかん 6 0002 いちご 3 で出て欲しいです。 たとえばこの場合、場所によってなど出てしまうものでしょうか? これはなぜなのでしょうか? よろしくお願いします。

  • PHP SQL 問合せについて

    PHP SQL 問合せについて http://okwave.jp/qa/q7689206.html での質問の続きとなります。 No,name 1,ばなな 2,りんご 3,ばなな 4,みかん 5,ばなな 6,りんご 上記テーブルで 1,ばなな 3,ばなな 5,ばなな 2,りんご 6,りんご 4,みかん の結果を得るSQLはどのように記述すればよいでしょうか? 回答 select * from tableA x order by (select count(*) from tableA y where y.name = x.name ) ,No で解決していますが、 select * from tableA x where name ='果物' とした場合、結果が異なります。 (結果が多い順にならない) 出現回数が多い順に並べるには、どのような記述になりますか? データには「果物以外のデータが含まれている」とします。 宜しくお願い致します。

    • 締切済み
    • PHP
  • SQL WHERE, HAVING について

    こんにちは。さっそくですが、 白男川 恵さん著作による 「Oracle Master Bronze 演習問題 SQL基礎I」 の問95について質問させていただきます。 問題文 CAT_ID列の値が20であるPRICE列の最大値を求めたい。 実行すべきSQL文として正しいものを選びなさい。 とあり、正解は (B) SELECT cat_id, MAX(price) FROM itemlist HAVING cat_id = 20 GROUP BY cat_id (C) SELECT cat_id, MAX(price) FROM itemlist WHERE cat_id = 20 GROUP BY cat_id なのですが、 WHERE句の使用法としては 大体の場合 WHERE (ターゲット) = (値) となると思うのですが、ターゲットのところが グループ関数でないのでこの場合は正解としてもよい、 ということでしょうか? 以下のサイトを別のタブで見ていただきたいのですが、 http://www.atmarkit.co.jp/fdb/rensai/tsql05/tsql05_1.html 「WHERE句とGROUP BY句を併用した場合、 WHERE → GROUP BYの順でクエリが評価されるため、 グループ化された結果をWHERE句の段階で利用できないのです。」 「HAVING句とGROUP BY句を利用した場合、 GROUP BY → HAVINGの順でクエリが評価され、 グループ化された結果に対し条件を指定することが可能です。」 http://www.atmarkit.co.jp/fdb/rensai/tsql05/tsql05_2.html 「HAVING句はGROUP BY句によってグループ化が行われたデータに対し、 絞り込みの条件を指定できます。 このため、絞り込み条件に集計関数を含めることが可能です。」 この設問の場合には WHERE→GROUP BYの順でも GROUP BY→HAVING の場合でもWHERE のターゲットがグループ関数で得られた値 で条件指定するわけではないので文法的にも正しく おなじ結果が得られる こういう解釈でよろしいのでしょうか? ご存知の方、教えていただけないでしょうか? よろしくお願いします。

  • 割合(パーセント)を求めるにはどのようにSQLを書けばよいのでしょうか?

    SQLで グループ毎にカウントした数でなくて割合を求めたいのです。 select name, count(*) from データベース名 group by name order by 2 desc; とすると、以下のように200件あるデータで グループ(名前)毎に個数が表示されますが、 田中 70 上村 120 橘川 10 下のように割合(パーセント)を求めるにはどのようにSQLを書けばよいのでしょうか? 田中 70 35% 上村 120 60% 橘川 10 5%

    • ベストアンサー
    • MySQL
  • SQLの書き方

    select A.NO, A.NAME, count(B.TEN) FROM T1 A, T2 B GROUP BY A.NO ORDER BY 3 DESC 結果として以下のようになってほしいのですが、どのようにSQLを書けばよいのでしょうか? 結果 NO | NAME | TEN ---+------+----- 3 + 上村 + 40 1 + 吉田 + 11 2 + 浅野 + 6 T1テーブル NO | NAME ---+-------- 1 + 吉田 2 + 浅野 3 + 上村 T2テーブル NO | TEN ---+-------- 1 + 10 2 + 5 3 + 0 1 + 1 2 + 1 3 + 40

  • グループ化したSQLの書き方について

    id,stpass,tokuten,branch,dateというフィールドをもつresultというテーブルを作成しました。 最高得点(フィールド名:tokuten)は、下記SQL(クエリーで作りました)でできます。 SELECT result.id, result.stpass, Max(result.tokuten) AS tokutenの最大 FROM result GROUP BY result.id, result.stpass; ただ、最高得点(Max(result.tokuten) AS tokutenの最大)を出したと同じレコードのそれ以外のフィールド(branch,date) を表示させるSQL(クエリー)がわかりません。 何方か、ご存知の方おられましたら、ご教授ください。

  • 条件付き合計をSQLで

    SQL初心者です。 ちょっとSQLの作り方で詰まったしまったので、アドバイスいただければと考えています。 月   名前   金額 2   Aさん   15000 12  Bさん 20000 1    Aさん 80000 2    Eさん 14000 ・  ・    ・ ・    ・    ・ のようなテーブルから、月ごとに、誰がいくら使ったかを表示するクエリを作りたいのです。 各フィールドに月、各レコードに人を配置したいと思っています。 一応考えたSQLが↓ SELECT DSUM([月],"テーブル名",月 = 1) AS 1月, DSUM([月],"テーブル名",月 = ) AS 2月, ・・・ AS 12月 FROM テーブル名 GROUP BY 名前 なのですが、かなり的外れかもしれません・・。 二つ(月と名前)の要素でグループ化するってのが難しいです。 アドバイスいただければと思います。

  • 【再】2)-SQL文の書き方を教えてください。

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=694458 先日この問題で投稿しましたが、未完成のため、再度要望を整理し、ご指導をお願いいたします。 W←tabel名:名称、日付、数量 明細データ:     名称   日付    数量 A   2003/10/01   200 B   2003/10/03   500 C   2003/10/10   4000 A   2003/10/03   200 A   2003/10/03   100 C   2003/10/15   100 B   2003/10/15   300 C   2003/10/15   50 B   2003/10/15   60 求めているクエリーのイメージ:    2003/10/15 時点 ================================================ 名称     当日数量     当月数量     A          0       300     B         360       860     C         150       4150 ------------------------------------------------- 先日教えてもらったSQL文、希望のクエリーを作れないです。 -------------------------------------------------- select 名称, sum(AAA) as 当日数量, sum(BBB) as 当月数量 from ( select 名称, 0 as AAA, sum(数量) as BBB from W where 日付 >= #2003/10/01# and 日付 <= #2003/10/15# group by 名称 union select 名称, sum(数量) as AAA, 0 as BBB from W where 日付 = #2003/10/15# group by 名称 ) group by 名称; このSQL文は、2番目のSelectのところでエラーが出る (From句の構文エラーです) -------------------------------------------------- 後、Accessバージョンによって、SQL文が変わるでしょうか?当方は、Access97を使っている。 ご指導をお願いいたします。

  • MySQL + PHP 同じテーブルを対象にした複雑なクエリ

    こんばんは。 Mysql+php環境で、以下のようなテーブルを持っています。 ちょっと複雑な内容でクエリ結果を求めたいのですが、 うまい方法が見つからず、質問させて頂きます。 ―――――――――――――――― ▽ユーザーテーブル ―――――――――――――――― user_id |user_name 1 |タロウ 2 |ヨシコ 3 |シゲル 4 |マユミ ―――――――――――――――― ▽所有果物テーブル ―――――――――――――――― goods_id |goods_name |user_id 1 |パイン |1 2 |みかん |1 3 |メロン |1 4 |リンゴ |2 5 |みかん |2 6 |イチゴ |2 7 |グレープ |3 8 |イチゴ |3 9 |キウイ |3 10 |リンゴ |4 11 |みかん |4 12 |メロン |4 ―――――――――――――――― ▽出力したい条件 ―――――――――――――――― 自分(例えばマユミ)が所有している果物(goods)と、 いずれか同じものを持っている人(user)が 他に持っている果物(goods)を出したいが、 自分が既に所有しているものは除く。 ―――――――――――――――― 今回のデータと条件ですと、 同じものを持っているuserはタロウとヨシコで、 彼らが持っていてマユミが持っていない果物は 「パインとイチゴ」になります。 このような結果を出したいのですが、 これを出力するにはどのようなSQL文にすればよいでしょうか? 実際のデータはもっとレコード数が多いテーブルです。 サブクエリを駆使しても、どうも思った結果が出ず・・・ どうかお助け下さい。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • GROUP BY使用時のソートについて

    OracleSqlにて「GROUP BY」使用した日付のデータを取得するSql文を作成したのですが、 「ORDER by」句に「DESC」を付けても降順ソートが行えません。 作成したSql文は以下の通りなのですがなぜ降順ソートが行えないのでしょうか? 「GROUP BY」を使用するとソート出来ないと言うことなのでしょうか? それとも日付型なのでソートが出来ないと言うことなのでしょうか? どなたかご存知の方おりましたらご教授下さい。 ------------------------------------------------- SELECT TO_CHAR(RECORDDATE,'YYYY/MM/DD') ,RECORDYEAR ,RECORDMONTH ,RECORDDAY FROM STOCKTBL WHERE TO_CHAR(RECORDDATE,'YYYY/MM/DD')<='2002/03/07' AND TO_CHAR(RECORDDATE,'YYYY/MM/DD')>='2002/02/22' GROUP BY TO_CHAR(RECORDDATE,'YYYY/MM/DD') ,RECORDYEAR ,RECORDMONTH ,RECORDDAY ORDER by TO_CHAR(RECORDDATE,'YYYY/MM/DD') ,RECORDYEAR ,RECORDMONTH ,RECORDDAY DESC -------------------------------------------------