• 締切済み

MySQL 最大値のレコードの特定

SQLが上手く作れないためお知恵をお貸し頂ければ幸いです。 articleテーブルに存在するユーザの一覧に、記事の投稿件数、記事に含まれるsizeの最大値、最大値が投稿された記事の登録日時、記事のタイトルを加えたものを抽出したいです。 [ article ] article_id user_id size insert_unixtime title ---------------------------------------------------------- 1 100 18 20130101 aaaaaaaaaaaa 2 100 10 20130102 bbbbbbbbbbbb 3 100 18 20130103 cccccccccccc 4 200 11 20130201 dddddddddddd ↓↓希望する抽出結果↓↓ article_id user_id count max_size insert_unixtime title ---------------------------------------------------------- 3 100 3 18 20130103 cccccccccccc 4 200 1 11 20130201 dddddddddddd 自己結合等で、ユーザ毎の最大sizeを抽出してそれに該当するレコードを探すことであるていどはできたのですが 最大sizeが複数あった場合に、両方のレコードを取得してしまいます。(上記の例では、article_id 1と3を抽出してしまう。 ※最大sizeが複数会った場合はinsert_unixtimeが大きい方のタイトルを表示したい。 うまく1SQLで抽出できないでしょうか。

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

みんなの回答

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

ユーザ毎の、article数とsizeの最大値、sizeの最大のものの登録日時とタイトルが取得したいという事ですよね? 下記の様なSQLで出来ると思います。(Ver. 5.5.8 で確認) ---------------------------------------- SELECT article_id, user_id, (SELECT COUNT(*) FROM article c WHERE a.user_id = c.user_id) AS count, size AS max_size, insert_unixtime, title FROM article a WHERE NOT EXISTS ( SELECT * FROM article b WHERE a.user_id = b.user_id AND (a.size < b.size OR a.size = b.size AND a.insert_unixtime < b.insert_unixtime) ) ---------------------------------------- WHERE句では、user_id が同じで size が大きいものと同じ size で insert_unixtime が大きいものが無いという条件、つまり、その user_id で最大 size, insert_unixtime のレコードを取得する条件を書いています。

  • hardgeek
  • ベストアンサー率50% (7/14)
回答No.1

こういうことですか? select article_id, user_id, size, insert_unixtime, title from article join (select max(article_id) as article_id from article where (user_id, size) in (select user_id, max(size) as size from article group by user_id) group by user_id) t using (article_id); INサブクエリなら select article_id, user_id, size, insert_unixtime, title from article where article_id in (select max(article_id) as article_id from article where (user_id, size) in (select user_id, max(size) as size from article group by user_id) group by user_id);

関連するQ&A

  • MySQLで、本日に一番近い日のレコード

    Linuxサーバーで、MySQLを使っています。 ユーザーの付属テーブルの中で、 同じユーザーのレコードが複数あります。 その多数のレコード中に、日付項目があります。 そこから、ユーザー毎に、本日に一番近い過去未来の日のレコードだけを抽出するには、 どのようなSQL文を書けばよいでしょうか? 抽出結果は、下記のようになるように。 ユーザーA、本日に一番近い日付、・・・・ ユーザーB、本日に一番近い日付、・・・・ ユーザーC、本日に一番近い日付、・・・・ ※同一ユーザーは、複数抽出されない。=ユーザーは、ユニークになる抽出結果。

    • ベストアンサー
    • MySQL
  • 最大値を含むレコードの抽出

    お世話になります。 SQLでIN句やサブクエリではなく、HAVING句+MAX関数を使用して最大値を含むレコードを抽出することはできるのでしょうか。 id | name | value --------------- 1 | aaaa | 2000 2 | aaaa | 1000 3 | bbbb | 1000 上の表でいうとnameフィールドでグルーピングしてidの1と3が抽出対象になります。MySQLを使用しておりますが、 標準SQLでお願いしたいです。 よろしくどうぞ。

    • ベストアンサー
    • MySQL
  • MySQLで、日付最大のレコード抽出

    MySQLをJAVAで使っています。 指定キーの中で、一番日付の大きなレコード項目全てを 取り出したいのですが、 下記SQLだと、何も抽出されません。 (今朝、ここで教えて頂いたSQL文です) 何が間違っているのでしょうか? さらに、もっと簡単なSQL文はないでしょうか? SELECT * FROM food WHERE (food_id = 1) AND (food_name = 'みかん') AND (karute_id = (SELECT MAX(date) FROM food WHERE (food_id = 1) AND (food_name = 'みかん'))) 与える検索キー項目は、food_id=1, food_name=みかん foodテーブル例 food_id  food_name   date --------------------------------- 1     みかん    2015-01-01 1     みかん    2015-02-01 1     みかん    null 1     みかん    2015-04-01 2     きんめだい  2015-01-01 2     じんたん   2015-02-01 2     コロッケ   2015-02-01

    • ベストアンサー
    • MySQL
  • 最大値を含むレコードの抽出

    あるテーブルから、最大値を持つレコードのキーと最大値だけでなく、そのレコードの値を出したいと思います。 最大値をもつレコードを抽出して、元のレコードと結合するしか方法はないのかなと思い、類似した質問があるような気もするのですが、条件が異なるとうまく行かないため、自分なりに考えてみました。 データベースはDB2です。 SELECT a.倉庫,a.品目,a.単価 FROM 在庫マスタ as a where (a.品目,a.単価) in (select b.品目, max(b.単価) from 在庫マスタ as b group by b.品目) つまり、副問合せするときの結合キーが複数あるとSQLがエラーになってしまうようなのです。 結合キーが2つ以上ある時、このようなパターンの対処方法は無いでしょうか?

  • MySQLで、日付最大のレコード抽出

    MySQLをJAVAで使っています。 指定キーの中で、一番日付の大きなレコード項目全てを 取り出したいのですが、 下記SQLだと、何も抽出されません。 何が間違っているのでしょうか? さらに、もっと簡単なSQL文はないでしょうか? SELECT * FROM food WHERE (food_id = 1) AND (food_name = 'みかん') AND (food_id = (SELECT MAX(date) FROM food WHERE (food_id = 1) AND (food_name = 'みかん'))) 与える検索キー項目は、food_id=1, food_name=みかん foodテーブル例 food_id  food_name   date --------------------------------- 1     みかん    2015-01-01 1     みかん    2015-02-01 1     みかん    null 1     みかん    2015-04-01 2     きんめだい  2015-01-01 2     じんたん   2015-02-01 2     コロッケ   2015-02-01

    • ベストアンサー
    • MySQL
  • mysql_insert_id()の使い方

    過去記事を参照させていただいたのですが、 値を取ってくることができず修正点がわかりません。 アドバイスいただければと思いますのでお願いします。 テーブルは 「userid」「user_name」「bil_id」「bil_name」 で、「user_name」「bil_id」「bil_name」は、 他から「in1」~で読み込んでいます。 //SQL $sql= "insert into user set user_name=($_POST["in1"]),bil_id=・・・(略) $rec=mysql_insert_id(); print($rec); 書き方に不明な点が多いですがコメントよろしくお願いします。

    • ベストアンサー
    • PHP
  • 複数列の最大

    初心者です。 SQL文で1レコード中の同一バイト数の複数列の最大を抽出したいのですが、書き方がよくわかりません。 A1|A2|A3|A4|A5 の時、A1~A5までで最大の値を抽出したいのですが・・ 何かよい方法がありますか?

  • accessでスコアが一番高いレコードのみを抽出する方法は

    accessでスコアが一番高いレコードのみを抽出する方法は 画像のようなtableで、各ユーザ毎に一番スコアが高いレコードのunique idを抽出したいと思っています。同じスコアがあった場合は、unique idが若い方を採用したいです。 これをなるべく簡潔に or 高速に処理するには、どのようなクエリ or sql文をかけばよいのでしょうか。

  • SQLで、過去で一番大きい日付のレコード抽出

    MySQLを使っています。 同じ商品のレコードが複数あります。 その多数のレコード中に、日付項目があります。そこから、 1)指定日に、2)一番近い過去の日の1件の、3)全商品のレコード、を抽出するには、 どのようなSQL文を書けばよいでしょうか? 1.過去に複数ある日付の中から、指定日に、一番近いレコード。 レコードの例) 指定日=2015-07-01 商品ID 日付 1 2015-10-11 ・・・未来 ⇒ 抽出せず 1 2015-08-02 ・・・未来 ⇒ 抽出せず 1 2015-07-01 ・・・指定日 ⇒ 抽出せず 1 2015-07-01 ・・・指定日 ⇒ 抽出せず 1 2014-01-01 ・・・過去 ⇒ 抽出せず 1 2015-06-03 ・・・過去 ⇒ 抽出したい★★ 2 2015-10-11 ・・・未来 ⇒ 抽出せず 2 2015-08-02 ・・・未来 ⇒ 抽出せず 2 2015-07-01 ・・・指定日 ⇒ 抽出せず 2 2014-01-01 ・・・過去 ⇒ 抽出せず 2 2015-06-03 ・・・過去 ⇒ 抽出したい ★★

    • ベストアンサー
    • MySQL
  • レコードセットからレコードセットって作れますか?

    WindowsXP,VB6,SP5,で開発しています。 タイトルそのままなのですが、 ある事情で、まずはデータベース(Access)からレコードセットを作成しています。 そのレコードセットをもとに色々と抽出したいんです。 もし、データベースからSQL文で抽出するときみたいに、そのレコードセットを、 SUM(~とかGROUP化したりとかできればいいなあと思っているのですが、 その方法がわからず、2,3回遠回りしてレコードセットを作成してます。 レコードセットからレコードセットを作成することってできないのでしょうか? わかりにくくてすみませんが、どうぞよろしくお願いしますm(_ _)m