• ベストアンサー

min について

こんにちは 宜しくお願いします。 ID 商品名 コードNO という3個のフィールドがあります。コードNOは172636,383636,172828,288388などランダムな数値です。 コードNOが100000~200000までをwhere条件で抽出し、 上の場合だと(172636,172828)この中から更に最小値 (172636)を求めコードNOが最小値であるレコードを表示したいのですがお願いします。 以下のコードでは駄目でした。 select min(codeno) from uder_tbl where codeno between 100000 and 200000;

  • uder1
  • お礼率38% (23/59)
  • MySQL
  • 回答数3
  • ありがとう数1

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

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

MySQLのバージョンが、5.0(開発中)より前かどうかで変わってきます。 (1)5.0以降なら、サブクエリが使えます SELECT * FROM under_tbl WHERE codeno=(SELECT MIN(codeno) FROM under_tbl WHERE codeno BETWEEN 100000 AND 200000); (2)5.0より前なら、複数の問い合わせに分ける必要があります テンポラリテーブル(*1)を使用する例です。 (a)テンポラリテーブルの定義 CREATE TEMPORARY TABLE w_tbl(codeno codenoと同じデータ型); (b)操作 INSERT INTO w_tbl(codeno) SELECT MIN(codeno) FROM under_tbl WHERE codeno BETWEEN 100000 AND 200000; SELECT * FROM w_tbl ; *1 MySQL バージョン 3.23 以降では、テーブルの作成時に TEMPORARY キーワードを指定することができます。テンポラリテーブルは現在の接続の間のみ有効で、接続が閉じると自動で削除されます。

uder1
質問者

補足

ご教授ありがとうございますchukenkenkouさん。 以下の様にしたのですがParse error: parse error in C:\php\kensaku.php on line 17 となってしまいました。ちなみに17行目は CREATE TEMPORARY TABLE w_tbl(codeno varchar(20)); です。 CREATE TEMPORARY TABLE w_tbl(codeno varchar(20)); INSERT INTO w_tbl(codeno) SELECT MIN(codeno) FROM uder_tbl WHERE codeno BETWEEN 100000 AND 200000; SELECT * FROM w_tbl;

その他の回答 (2)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

> SQLエラーとなってしまいました 副クエリが使えないバージョンのMySQLでしょうか? だったら、クエリを二つ実行しないとダメかも。 エラーメッセージの詳細を補足したら、詳しい人が回答してくれるかも。 ってもしかして、 > select min(codeno) from uder_tbl where codeno between 100000 and 200000; ――で、目的のcodenoが実は取得できてない…って事はないですよね?

uder1
質問者

補足

どうやら副クエリが使えないバージョンの様です。 コマンドプロンプトではselect min(codeno) from uder_tbl where codeno between 100000 and 200000; で取得した値を元にselect from * uder_tbl where codeno=取得した値;で出来たのですが私の目的はphp+mysqlでブラウザ上に表示させたいと思ってます。select min(codeno) from uder_tbl where codeno between 100000 and 200000; で取得した値が変数として扱えるなら出来そうなのですが...エラーメッセージの詳細は特にない様です。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

select * from uder_tbl where codeno=(select min(codeno) from uder_tbl where codeno between 100000 and 200000); ――とか。

uder1
質問者

補足

早速のご回答ありがとうございます 残念ながらSQLエラーとなってしまいました。

関連するQ&A

  • 複数の検索結果をSELECT条件にしたい

    SELECT KANRI_NO ,EDA_NO ,NO_S ,NO_E FROM KANRI_TBL WHERE KANRI_NO='1' ORDER BY EDA_NO; の検索結果が、 KANRI_NO ,EDA_NO ,NO_S ,NO_E 1 , 1 , 1 , 10 1 , 2 , 52 , 60 1 , 3 , 90 , 99 のような結果をVBで、 SELECT  * FROM SYOSAI_TBL WHERE BETWEEN 1 AND 10 BETWEEN 52 AND 60 BETWEEN 90 AND 99; のような形の編集しています。 これをひとつのSQL分では書けないのでしょうか? 教えてください

  • SQlを使用して指定レコードの削除を行いたい

    SQL構文を使用して、テーブル内の指定のデータを削除したいと思っています (oracle11gです) 条件抽出テーブル:PRM_A 抽出条件1の対象カラム:NO_1(6ケタで年月が入っている) 抽出条件2の対象カラム:NO_2(0か1が入っている) 抽出内容:NO_1の年月のうち、最小の値かつ、NO_2の値が0である →抽出結果として、6けたの年月が出力される 削除対象テーブル:DEL_TBL_A 削除条件用カラム1:DEL_COL_1 削除条件用カラム2:DEL_COL_2 削除条件:DEL_COL_1が「抽出結果」の1~4桁目(4桁の数値)と一致し、 DEL_COL_2が「抽出結果」の5~6桁目(2桁の数値)と一致する 以上の処理を行おうとして、まずは前半部分(抽出結果の抜き出しまで)を行いました。 select min(NO_1) from PRM_A where NO_2=0 上記で、想定できる結果の出力ができました。 その次に、削除条件を作成しようとしたのですが、下記の記載で実施したところ、 Error [row:3,col:130] ORA-00936: 式がありません。 と出力されました。 select substr((select min(NO_1) from PRM_A ),1,4) from PRM_A where NO_2=0 and (select min(NO_1) from PRM_A) ; 申し訳ございませんが、理由と正しいSQL文がお分かりになられる方がおりましたら、ご教授願えませんでしょうか

  • date型でのbetweenについて教えてください。

    皆様、新年明けましておめでとうございます。 早速ですが、date型でのbetweenについて教えてください。 SQL文 SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31' を発行すると、2007-12-31のレコードがあるのに該当しません・・・ 試しにSQL文を SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59' としても2007-12-31のレコードは検索されません・・・ SQL文を SELECT * FROM test WHERE date between date '2007-12-01' and date '2008-01-01' にすると2007-12-31が該当するのですが、 SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31' では2007-12-31のレコードは該当しないものでしょうか?? select * from test where num between 10 and 100 とした場合では、num が 10 ~ 100 のものが問い合わされますよね?? date型になるとこうならないのでしょうか?? よろしくお願いします。

  • タイムスタンプ型を抽出条件に指定した場合のSQL

    タイムスタンプ型を抽出条件に指定した場合、どの様なSQL文を指定すれば良いでしょうか? 該当するレコードは確かに存在していますが、以下のSQL文では「空」になってしまいました。 【実行したSQL文】 SELECT フィールド FROM テーブル WHERE タムスタンプ型フィールド BETWEEN '2011-08-05 20:00:00' AND '2011-08-06 19:59:59' 何卒、ご教授頂ければと存じます。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • シンプルなSQLの書き方がわかりません。

    以下のSQLをシンプルに一つにしたいのですが、どのように書いたらよろしいでしょうか? どうぞご返答頂けますようお願い申し上げます。 --test1_tblの抽出 select a1 as a1, b1 as b1 from a_tbl where c=1 --test2_tblの抽出 select a1 as a1, e1 as e1 from b_tbl where rowid in (select min(rowid) from ee group by a1) and a1 is not null and a1 !=' ' order by a1 --test1_tblとtest2tblの結合 select t0.a1 as a1, t0.b1 as b1, t1.e1 as e1 FROM test1_tbl t0, test2_tbl t1 WHERE (t0.a1 = t1.a1)

  • AccessのクエリでvbLfのみ抽出するには

    Access2010のクエリー(SQL)で vbLfかvbCrLfが含まれているレコードを抽出するには、 SELECT [テーブル1].* FROM テーブル1 WHERE [テーブル1].フィールド1 Like "*" & Chr(10) & "*"; vbLfが含まれているレコードは抽出せず、 vbCrLfが含まれているレコードだけを抽出するには、 SELECT [テーブル1].* FROM テーブル1 WHERE [テーブル1].フィールド1 Like "*" & Chr(13) & Chr(10) & "*"; でよいと思いますが、 vbCrLfが含まれているレコードは抽出せず、 vbLfが含まれているレコードだけを抽出するには、 どのように記述すればよいのでしょうか。 よろしくお願いします。

  • WITH句を使用したSQLの結果

    WITH句を使用して総件数と1~20件までのデータを同時に取得するSQLを組んでみたところ、 WITH TMP AS (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM TMP) T1, TMP T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20; Oracle10.2.0.3.0のバージョンで ALLCNTが21になってしまう現象が発生してしまいました。 Oracle10.2.0.4.0や9iでは発生せず正しい総件数が取得できるのですが、 バージョンによる不具合は考えられますでしょうか。 それともSQL自体なにか悪い部分があるのでしょうか。 ちなみに T2.CHECKROWNUM BETWEEN 1 AND 100; と帰るとALLCNTが101と帰ってきます。 また、WITH句を使わず下記のようにTMPの部分をWITH句で使用したSQLに 置き換えると正しくALLCNTが取れます。 SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO)) T1, (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20;

  • betweenで境界値が取得できない。

    連番の歯抜け値を取得するSQLを作りたいと思っています。 例えば、カラムAに、1,2,3,5,6,7,9,10(4と8が抜けている) と数値の入っているテーブルAがあるとします。 これに対して、 SELECT MIN(カラムA + 1) FROM テーブルA WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA) とSQLを投げた場合、4が取得できます。 これにbetween句を付与したいのですが、そうすると境界値が なぜか取れなくて困ってます。 具体的には、 SELECT MIN(カラムA + 1) FROM テーブルA WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA) AND BETWEEN 8 AND 10 とした場合、NULLが返ってきてしまいます。 普通、BETWEENは境界値も対象になるはずですが、何故このような 結果になってしまうのでしょうか? 修正点をご教授いただけないでしょうか? 宜しくお願いします。

  • <SQL>条件付きで最小値レコードを抽出する方法

    SQLite3.7.5を使っています。 以下<抽出前>の様なテーブルから、col2の値が"FALSE"で(col1=3,4,5の3つ)かつ、col3が最小値(col3=3)であるレコードを<抽出後>のように抽出するSQL文をご教示ください。 <抽出前> col1 | col2 | col3 1 | true | 3 2 | true | 0 3 |false | 3 4 |false | 5 5 |false | 3 <抽出後> col1 | col2 | col3 3 |false | 3 5 |false | 3 自分で考えたSQL文は以下です。 抽出結果は問題ないのですが、同じSELECT文を2回書いていてだいぶ効率悪いことをしているのではないかと思い質問しました。 よろしくお願い致します。 SELECT * FROM (SELECT * FROM test WHERE (col2 = false)) WHERE col3 = (SELECT min(col3) FROM (SELECT * FROM test WHERE (col2 = false)))

  • ROW_NUMBER()を使用したデータ取得

    ROW_NUMBER()を使用してORDERした結果の5行目から10行目を 取得したい場合、どこのサイトを参照しても下記(1)のように NOで並び替えたデータをインラインビューとして WHERE RNUM BETWEEN 5 AND 10 と条件を絞っていますが、(2)のように直接条件を指定した場合と どのような違いがあるのか教えてください。 (1) SELECT NO, NAME FROM ( SELECT NO, NAME, ROW_NUMBER() OVER (ORDER BY NO) RNUM FROM ROWNUM_TEST ) WHERE RNUM BETWEEN 5 AND 10 (2) SELECT NO, NAME,ROW_NUMBER() OVER (ORDER BY NO) RNUM FROM ROWNUM_TEST WHERE RNUM BETWEEN 5 AND 10