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

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

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

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

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

  • ベストアンサー
  • 回答No.2
  • f_a_007
  • ベストアンサー率20% (955/4565)

LIMIT句を使えば、もっと簡単に出来るよ。 SELECT TOP 1 * FROM food WHERE food.food_id=1 ORDER BY food.entry_date DESC; つまり、DESCで並び変えて先頭を抽出するだけ。 MySQL LIMIT で検索を!

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

質問者からのお礼

ご回答ありがとうございます。 これなら、確実にで、簡単ですね。 SQLは、同じ目的を達成させるのに、 人によりかき方が違うので、難しいですね。 これでやってみます。 大変たすかりました。 ありがとうございます。

関連するQ&A

  • 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
  • whereの使い方が分からないのですが…

    foodテーブルの全ての項目内から「りんご」「みかん」というのキーワードをAND検索させたいのですが、 select * from food where ("りんご" AND "みかん"); select * from food where * "りんご" AND "みかん"; select * from food where *="りんご" AND *="みかん"; select * from food where *=("りんご" AND "みかん"); 思いつく限り試しましたが、どれもうまく行きません。 select * from food where (a="りんご" AND a="みかん") or (b="りんご" AND b="みかん") or (c="りんご" AND c="みかん") or… と、延々と続いて書くしかないのでしょうか? 何か方法はありますか?

    • ベストアンサー
    • MySQL
  • 最後のデータを含むレコード1行 MYSQL

    お世話になります。 最後の日にちを含むレコード全ての抽出方法がどうしてもわかりません。 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 4 AA 3/2 7 5 BB 3/2 4 6 AA 3/3 1 これを、select * from テーブル group by name とすると、 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 select id, name, max(date),amount from テーブル group by name とすると、 id name date amount 1 AA 3/3 5 2 BB 3/2 5 3 CC 3/1 5 望んでいる結果はこうです。最後のdateを含むレコード全てです。 id name date amount 3 CC 3/1 5 5 BB 3/2 4 6 AA 3/3 1 select * from テーブル as a where a.date=(select max(b.date) From テーブル as b where a.id=b.id); このようにしましたが、データの数が膨大なのですごく時間がかかってしまいます。 他、シンプルな方法はないでしょうか。 よろしくお願いします。 MYSQL バージョン5.0.45

その他の回答 (1)

  • 回答No.1

何と何を比較してんだ。

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

質問者からのお礼

みかんと、きんめだい を比較しています。 これじゃ、くだものと、魚だから、成分が違うから、一致しないのかな?

関連するQ&A

  • 日付型(時刻含む)を抽出条件にして行を抽出したい。

    はじめまして、よろしくお願いします。 現在SQLサーバー2000を使用してこの処理を行おうと思っております。 一度テーブルに格納したデータをSELECT文を使って抽出したい と思っているのですが、WHERE条件に日付型のフィールドを指定するとうまく行きません。(時刻が日付型のフィールドに入っている場合、うまくいきません。) やっていることは YMD(DATE型・主キー)、ID(VERCHAR型・主キー)、NAME(VERCHAR型) というのテーブル(テーブル名:MEIBO)に入っている 2002/02/02 14:10:55、0001、山田 太郎 というデータを 取込年月日、個人IDを指定して特定の列を取り出そうとしています。 SQL文は SELECT * FROM MEIBO WHERE YMD = '2002/02/02 14:10:55' AND ID = "0001' と記述していますが、一件もヒットしません。 DATE型のフィールドにはINSERTするときにGETDATE()をつかってシステム日付を 格納するようにしています。 GETDATE()ではなく、DATE()を使ってシステム日付を格納した 2002/02/02、0001、山田 太郎 という時刻の入っていないデータに対しては SELECT * FROM MEIBO WHERE YMD = '2002/02/02' AND ID = "0001' というSQL文でヒットするのですようです。 時刻が入ったらそのフィールドを抽出条件として使うことは無理なのでしょうか? 基本的な部分で勘違いしているのかもしれませんが なにかお気づきの点がありましたら、ご教授ください。

  • MySQLで、NULLか空の判定について

    下記のSQL文は、間違っていると思われます。 MySQLをJAVAでコーディングしています。 やりたいことは、 1)food_textが、NULLか、空っぽの時に、 2)limit_dateが最大の 3)レコード1件を抽出したいのです。 SELECT Id, food_id FROM foods   WHERE    (kind_id = 1)  AND (food_text IS NULL) AND (DATALENGTH(food_text) <= 0)  AND (delete_flag = false)  ORDER BY limit_date DESC  LIMIT 1;

    • ベストアンサー
    • MySQL
  • グループ中で最大値を含む行を抽出するSQLはどう書けば良いでしょうか

    列A,Bでグループ化し、グループ中で列Cが最大値の列を取得したいのです。 数百万件あるので極力低コストにしたく、 副問合せはINDEXが効かないと聞いたのですが、 それ以外思いつきませんでした。 副問合せしない方法はないでしょうか? また、副問合せの中でコストの低いSQLはどんなものでしょうか。 ■テーブルです 名前 型 CUST_ID CHAR(8) BRANCH_ID CHAR(4) VALID_DATE DATE MYDATA VARCHAR2(20) CUST_ID BRAN VALID_DA MYDATA 19740704 0000 06-01-01 comment0001 19740704 0000 05-12-01 comment0000 19740704 0000 06-02-01 comment0002 19740704 0001 06-01-01 comment0011 19740704 0001 06-03-01 comment0012 ■このような結果が欲しいのですが。。。 CUST_ID BRAN VALID_DA MYDATA 19740704 0000 06-02-01 comment0002 19740704 0001 06-03-01 comment0012 ■考えたSQLです(検証済) select a.cust_id,a.branch_id,a.valid_date,a.mydata from test a,(select cust_id,branch_id,max(valid_date) as mvd from test group by cust_id,branch_id) b where a.cust_id=b.cust_id and a.branch_id=b.branch_id and a.valid_date=b.mvd ; select a.cust_id,a.branch_id,a.valid_date,a.mydata from test a where not exists (select * from test b where a.cust_id=b.cust_id and a.branch_id < b.branch_id) ; select cust_id,branch_id,valid_date,mydata from test where (cust_id,branch_id,valid_date) in (select cust_id,branch_id,max(valid_date) from test group by cust_id,branch_id) ; select cust_id,branch_id,valid_date,mydata from (select cust_id,branch_id,valid_date,mydata,max(valid_date) over(partition by cust_id,branch_id) as mvd from test) where valid_date=mvd ;

  • VBSの中で書くSQL文の記述方法

    よろしくお願いします。 select * from db1 into id,password,date,name where db1_id = **** and db1_password = **** and db1_date = 99999999; (db1_id,db1_password,db1_dateがプライマリキー) db1という表からプライマリキーに該当したデータを取り出し、 変数に格納したいと思っています。 このSQL文をASPのVBSの中で実現する方法を教えてください。 <% Dim Conn,SQL,RS Dim id Dim password Dim date Dim name db1=server.mappath("db1.mdb") DBName="Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & db1 Set Conn = Server.CreateObject("ADODB.Connection") Conn.open DBName SQL = "select * from db1" INTO = "into id,password,date,name" WHERE = "where db1_id = **** and db1_password = **** _ and db1_date = 99999999" SQL = SQL & INTO & WHERE & ";" Set RS = Server.CreateObject("ADODB.Recordset") RS.Open SQL, Conn,3,3 %> これでうまくいくかな~と思ったのですが・・・。

  • MAX関数と範囲指定

    AのデータをBにコピーをしたいのですが、AからBにうつすときはその日の一番新しいものだけにしたいのです。 例えば、昨日と一昨日のデータの一番新しいやつをコピーしたいのです。今日のデータが入っているので単純にMAXで取り出せないのです。 INSERT INTO B (DATE,NAME,ID) SELECT (DATE,NAME,ID,更新日時) FROM B WHERE DATE = (SELECT MAX(DATE) FROM A WHERE DATE BETWEEN 一昨日 AND 昨日); 根本的に違っているんでしょうか

  • mysql_query等でレコード数を変数に格納

    mysql> SELECT COUNT(id) AS rows FROM someTABLE WHERE name IN ( 'A','B','C' ) ; で +------+ | rows | +------+ | 9 | +------+ と出すことができます。 この rows の数「9」を php の変数に入れたいのです。 <?php // DB接続省略 $sql = "SELECT COUNT(id) AS rows FROM someTABLE WHERE name IN ( 'A','B','C' )" ; $result = mysql_query($sql, $conn); var_dump($sql."<br />"); echo ($result."--result"."<br/>"); $rows= mysql_num_rows($result); echo ($rows."--rows"."<br/>"); ?> として、ブラウザで確認すると string(80) "SELECT COUNT(id) AS rows FROM someTABLE WHERE name IN ( 'A','B','C' ) " Resource id #3--result 1--rows となって、 $rows に値’9’が入りません。$rows にレコード数を取得させるには、どうすれば良いでしょうか?

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

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

  • ACCES「抽出条件でデータ型が一致しません」

    環境 WindowsXP Access2003 SELECT A.ID, A.NAME, A.DATE FROM ( (SELECT ID, NAME, DATE FROM ・・・) A LEFT JOIN (SELECT ID, NAME, DATE FROM ・・・) B ON A.ID = B.ID ) ORDER BY A.ID こんな感じのSQLを実行すると、 「抽出条件でデータ型が一致しません」 というエラーとなります。 SQL文を以下の様に変更すると、エラーにはなりません。 1.「ORDER BY A.ID」排除 2.ORDER句を「A.ID」以外の「A.NAME」「A.DATE」「B.ID」「B.NAME」「B.DATE」に変更 3.ON句の順番を「ON B.ID = A.ID」に入れ替え(ORDER句は、「A.ID」のまま) なぜ、このようなエラーになるのでしょうか? 特に3が理解不能なのですが、 ON句の順番がORDER句に影響を及ぼすことがあるのでしょうか? 以上、よろしくお願いします。

  • 日付の古い順番に削除したいのですが

    レコード登録時にテーブルの件数が規定数を越えているならば、指定件数分の既存レコードを削除したいのですが、方法が見つかりません。 目的のテーブルは以下のような構造になっております。 P-Key1:大枠のID(プライマリキー1) P-Key2:大枠内の序列を表す(プライマリキー2) THRED:登録元スレッド番号(プライマリキー3) FILE:ファイルパスを格納 TIMESTAMP:登録日付、DATE型 TERMID:端末ID(プライマリキー4) この内、削除時に指定するのはスレッド番号と端末IDだけです。 残りのプライマリキーが一つならば、IN句の副問い合わせでできそうな感じですが、2つある為、IN句では指定できませんでした。 以下は、試したSQL文です。ただし、全部失敗しております。 DELETE FROM (select * FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' ORDER BY TIMESTAMP) WHERE ROWNUM < 3; DELETE FROM テーブル WHERE P-Key1 IN (SELECT P-Key1 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' AND ROWNUM < 3 ORDER BY TIMESTAMP) AND P-Key2 IN (SELECT P-Key2 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' AND ROWNUM < 3 ORDER BY TIMESTAMP); よろしくお願いします。

  • MySQLのサブクエリーでエラーがでます

    現在MySQLを使って開発をしています。 SQLもMySQLもまだあまり使ったことがないのでなにか大きな勘違いをしている かもしれませんが、自分で作ったデータベースにMysqlコマンドでアクセスし、 以下のようにselectを行うとsyntaxエラーが発生します。 mysql> select CREATE_DATE from user where cust_id = (select cust_id from customer where memo = 'memo'); ERROR 1064: You have an error in your SQL syntax near 'select cust_id from customer where memo = 'memo')' at line 1 しかしサブクエリーの内容も、その前のselectもそれぞれ下記のように単体で実行すると正常に動作するので、文法的には間違っていないと思います。 ERROR 1064のsyntaxエラーは何を指しているのでしょうか? ぜひご教示ください。 mysql> select cust_id from customer where memo = 'memo'; +---------+ | cust_id | +---------+ | 1 | +---------+ 1 row in set (0.00 sec) mysql> select CREATE_DATE from user where cust_id = '1'; +-------------+ | CREATE_DATE | +-------------+ | 2001-07-23 | +-------------+ 1 row in set (0.00 sec)