• ベストアンサー

サブクエリ:各カテゴリ内で最大の番号を持っている

各カテゴリ内で最大の番号を持っているものの詳細を表示したいと思っていますが、以下のクエリではエラーがでてしまいます。 SELECT * FROM favorite WHERE no = (SELECT max(no) AS max_no FROM favorite GROUP BY category) 何が悪いのでしょうか?ぜひアドバイスをお願いします。

  • fabu
  • お礼率69% (384/554)
  • MySQL
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

select * from favorite f1 where not exists ( select 1 from favorite f2 where f1.category=f2.category and f1.no<f2.no )

fabu
質問者

お礼

お礼が遅くなり申し訳ありません。 実装を止めてしまいました。。

その他の回答 (1)

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

単純な話、イコールではなくINを使えばいけます。 SELECT * FROM favorite WHERE no in (SELECT max(no) FROM favorite GROUP BY category) きちんとやるならcategoryも含めてinで抽出した方がいいかもしれません SELECT * FROM favorite WHERE (category,no) in (SELECT category,max(no) FROM favorite GROUP BY category)

関連するQ&A

  • サブクエリに関して()

    $sql2 = 'SELECT ki,id,name,day,tday,st FROM tim WHERE (ki,name,day,st) IN (SELECT ki,name,day,max(st) FROM tim WHERE (ki,name,day) IN (SELECT ki,name,MAX(day) FROM tim where ki='.$_SESSION['ki'].' GROUP BY id) group by id)' ; IDごとにカラムday,stの最大値を出力するもです。(以前おしえていただきました) これに更にsvの最大値も条件にいれたい場合どうしたらいいでしょうか?;

    • 締切済み
    • PHP
  • サブクエリについて

    サブクエリが上手く行きません、何が間違ってるのでしょうか? select IODate, (select sum(Price) as "収入" from dailyio where IO='収入' group by IODate) , (select sum(Price) as "支出" from dailyio where IO='支出' group by IODate) from dailyio group by IODate; dailyio------------------------------------- フィールド名 型 Code bigint(20) IODate date IO varchar(255) Koumoku varchar(255) Syousai varchar(255) Memo text Price bigint(20) ----------------------------------------------- ご多忙中とは存じますが宜しくご教授お願いします。

    • ベストアンサー
    • MySQL
  • サブクエリの使い方

    Table t1には t1code|t1type ------------------ 花子|1 太郎|1 一郎|2 次郎|2 五郎|2 Table t2には t2code|date ----------------- 太郎|2012-05-30 太郎|2012-05-30 花子|2012-05-10 花子|2012-05-10 次郎|2012-03-20 五郎|2012-04-10 一郎|2012-03-01 と登録されている場合に t1type毎に一番新しいdateをもつt2codeを抽出したいのです。 そこで、 select t2code,max(date) from t1 inner join t2 on t1code = t2code where (t2code,date) in (select t2code,max(date) as d from t2 group by t2code) group by t1type としたところ、 +--------+------------+ | t2code | max(date) | +--------+------------+ | 太郎 | 2012-05-30 | | 次郎 | 2012-04-10 | +--------+------------+ となります。 本来は、次郎→五郎になってほしいのですが、 どこが悪いのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • phpでmysqlを使ってデータベース内の最大値の取得

    PHPでMYSQL内テーブル(hogehoge)の「no」フィールドの最大値を取得をしたいのですが、ほしい結果が得られません。 【PHP】 -------------------------------------------------------------- $my_Max = "select max(no) from hogehoge"; $kekka_max = mysql_query($my_Max); -------------------------------------------------------------- no→今回最大値を取得したい項目(int) 【結果】 これをechoで出力すると、 ----------------------------- Resource id #4 ----------------------------- となってしまいます。 「no」の中の最大値を取得したいのですが、どうしたらよいでしょうか? 【環境】 WindowsXP mysql:5.0.51 php:5.2.5

    • ベストアンサー
    • PHP
  • in (サブクエリ) わかんない

    table hh; +------+ | id | +------+ | 1 | | 2 | | 3 | | 2 | | 1 | | 1 | +------+ select id,count(*) as cou from hh group by id having count(*) in (1,2,3); こいつはOK select id,count(*) as cou from hh group by id having count(*) in (select count(*) from hh group by id); こいつはダメ 違いはなんですか、教えて下さい

  • サブクエリ内で INNER JOIN は

    グルーピング内で、あるカラムの最大値のレコードで絞り込む方法は、 以下のサイトで知ることができましたが。 http://www.yokablo.com/20120905717.html tb_score +-------+-------+-------+ | c_name | game | c_score | +-------+-------+-------+ | 山田 | 高飛び | 90 | +-------+-------+-------+ | 山田 | 徒競走 | 85 | +-------+-------+-------+ | 山田 | 玉入れ | 90 | +-------+-------+-------+ | 鈴木 | 徒競走 | 85 | +-------+-------+-------+ | 鈴木 | 騎馬戦 | 50 | +-------+-------+-------+ | 室伏 | 綱引き | 100 | +-------+-------+-------+ | 室伏 | 玉入れ | 10 | +-------+-------+-------+ SQL文: SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX(c_score) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING (c_name) WHERE c_score = MAXSCORE 私の場合、t_score の親テーブル名`t_company`と、 子テーブル`t_items`がありまして、 以下のようなことをやりたかったのですが、エラーとなります。 上記SQL をサブクエリにします。 select * from ( SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX( c_score ) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING ( c_name ) INNER JOIN t_company ON t_company.c_name = tb_score.c_name WHERE c_score = MAXSCORE ) as T1 , t_items where T1.id_score = t_items.id_score 結果エラーメッセージは、 #1060 - Duplicate column name 'c_name' でした。 エラー箇所が、 GROUP BY c_name か、 USING ( c_name ) か、 INNER JOIN t_company ON t_company.c_name = tb_score.c_name なのか、分かりません。 SQL の規則としてやってはいけないことをやっていると想像してますが、 ご指摘・ご指導いただけると大変に助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Access 2000 サブクエリとJOIN

    Access2000でSQLを発行したのですが、 エラーが出てしまいます。 テーブル(仮にtest1、test2)があるとして test1 ------------------------- 主キー | 番号|項目    1|  1|りんご    2|  2|ぶどう    3|  3|みかん    4|  4|いちご test2 ----------------------------- 一つ目|二つ目| 1| 2| 4| 1| ・・・略 test2には2つのフィールドがあり、1,2,3,4を既定値として 入れるようにしています。 やりたいとこは、test2をグループ化し「一つ目」と「二つ目」 の規定値の個数(1、2、3、4)それぞれのカウントを求めたいのです。 一つのフィールドの場合は、 select * from test1 join test2 test1.番号=test2.一つ目 group by test1.番号 で求められたのですが、二つのフィールドをグループ化した際、 一つ目のフィールドと同じ個数が二つ目のフィールドにコピーされてしまうのです。 ですので、FROM句でサブクエリを結合しその中で、 group化したものを、いくつかのサブクエリと結合し てみたのですが、うまくいきませんでした。 select cnt1.一つ目,cnt2.二つ目 from (select * from test1 left join test2 on test1.番号=test2.一つ目group by test1.番号) as cnt1 left join (select * from test1 left join test2 on test1.番号=test2.二つ目group by test1.番号) as cnt2 on cnt1.番号=cnt2.番号 といった形で作ってみました。 エイリアスをつけてしまった時点でエラーが出ているので、 どうにもしようがありません。 申し訳ないのですが、ご教授のほどよろしくお願いいたします。

  • order byで並び変えし最大値の項目の抽出方法ついて

    すみません。 order byで並び変えし最大値の項目のみ一意で抽出したいのですが 、 SELECT * from ta order by no,date1,date2; no | date1 | date2 ----+-------+------- 11 | 2008 | 0501 11 | 2008 | 0502 11 | 2008 | 0502 11 | 2008 | 0503 12 | 2008 | 0501 12 | 2008 | 0502 12 | 2008 | 0503 13 | 2008 | 0501 13 | 2008 | 0502 13 | 2008 | 0503 14 | 2008 | 0501 とあった場合、 no,date1,date2のorder by順番で並び変えし 11 | 2008 | 0503 12 | 2008 | 0503 13 | 2008 | 0503 14 | 2008 | 0501 とno項目に対し一つずつだけ出力したい場合どのようにしたらよいのでしょうか? LIMITとoffsetだと1項目分しか出力されず困っております。 SELECT * from ta where no in (select no from ta group by no limit 1 offset 0) order by no,date1 desc,date2 desc limit 1; 宜しくお願い致します。

  • Delphiでサブクエリは可能か

    Delphiいやプログラム初心者のものなのですが 困っていますのでどなたか回答願えればと思っております。 Delphiではサブクエリを発行することはできないのでしょうか? 色々試してみてるのですが、「キーワードが無効です'('」のような エラーが出てしまいます。 例えば以下のような場合 SELECT 日付,商品No,商品名,SUM(仕入数) AS 仕入数,SUM(売上数) AS 売上数 FROM ( SELECT siire_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,SUM(vol) AS 仕入数,0 AS 売上数 FROM SiireData WHERE siire_date >= '2006/05/01' AND siire_date < '2006/06/01' GROUP BY siire_date ,goods_code ,goods_name UNION ALL SELECT delivery_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,0 AS 仕入数,SUM(vol) AS 売上数 FROM URIAGEDATA WHERE delivery_date >= '2006/05/01' AND delivery_date < '2006/06/01' GROUP BY delivery_date ,goods_code ,goods_name ) サブクエリが無理であれば、一時テーブルを利用しようと考えているのですが・・・わかりません。 Delphi Ver5.0を使って開発しています。 DBはDatabaseDesktop?を利用 どちらの回答でも結構ですのでご教授よろしくお願いします。

  • サブクエリ

    見ていただいてありがとうございます。 ただいま、業務でSQLを作成しているのですが、 なにぶん経験が浅く、行き詰ってしまっています。 どなたかわかる方、どうぞご教授ください。 環境は、 OS:WinXP Honme PG:VB.net Server:SQLServer2000 です。 わからないのは、以下の様なSQLです。 SELECT * from (SELECT tblA.field1 , tblA.field2, MAX(tblA.field3) AS MxNum FROM ( (tblA INNER JOIN tblB ON tblA.field1 = tblB.field1) INNER JOIN tblC ON tblA.field2 = tblC.field1 ) INNER JOIN tblD ON tblA.field4 = tblD.field1 GROUP BY tblA.field1,tblA.field2,tblA.field3) サブクエリの使い方がおかしいらしく エラーとなってしまいます。 (「fromの後に不要な文字が・・・」という  構文エラーになります。) サブクエリとして使用しようとしている()内の SELECT文は、クエリアナライザで実行すると 正常に終了して結果が返ってきます。 大変困っているので、 どうか宜しくお願いいたします。