• 締切済み
  • 困ってます

1つのsql文でデータを取得したい

phpとmysqlを連携させデータを取得しています。mysql5です。 現在は2つのテーブルからデータを取得するため以下のように2回のsql文を発行しています。 $sql = 'SELECT products_id, name, products_flag, comment1, IF("' . $products->beforedays . '" < DATE(create_date), "1", "0") as new, FROM products WHERE status = ? AND del_flg = ? ORDER BY create_date DESC'; // 1回目のsqlで取得したproducts_idを参照し下記のsqlを実行 $sql = 'SELECT MIN(price1) as min_price1, MAX(price1) as max_price1, MIN(price2) as min_price2, MAX(price2) as max_price2, IFNULL(price2, price1) as price0, stock FROM products_class_detail WHERE products_id = ?'; これを1回のsqlにまとめる場合どのような書き方になるでしょうか? 自分なりに下記のようにしてみたところ動作はするのですが複数のデータが条件に 当てはまるはずがminとmaxがあるためか条件に当てはまる最後のデータのみしか 取得されませんでした。 ※試しにmin,maxを外すと複数のデータを取得できました。 $sql = 'SELECT products.products_id, products.name, products.products_flag, products.comment1, IF("' . $products->beforedays . '" < DATE(products.create_date), "1", "0") as new, MIN(products_class_detail.price1) as min_price1, MAX(products_class_detail.price1) as max_price1, MIN(products_class_detail.price2) as min_price2, MAX(products_class_detail.price2) as max_price2, IFNULL(products_class_detail.price2, products_class_detail.price1) as price0, products_class_detail.stock FROM products, products_class_detail WHERE products_class_detail.products_id = products.products_id AND products.status2 = ? AND products.del_flg = ? ORDER BY' . $where_sql; 商品の情報を取得するsqlで最後のorder句は商品の並び順の変更でユーザーの指定した 順番(新着順や価格順等)で表示するためのものです。 2回のsqlの場合は問題なく動作していたのですがで新着順や価格順に並び替えを行うため 1回のでsqlで行いたいと思っております。 新着順の場合は1回目のsqlに条件が入るので問題ないのですが価格順の場合は2回目の sqlに条件が入るので2回のsqlではうまく並び替えができませんでした。 ソースの短縮にもなり可能であれば1回のsqlで完結させたいのですがどうすればいいものか わからずつまづいております。 詳しい方がいらっしゃいましたら宜しくお願い致します。

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

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

みんなの回答

  • 回答No.2

大変申し訳ないのですが、 まずは質問者様がどのように試して上手くいかなかったのか 聞かせていただけますでしょうか。 後学のためにも自分で解決する力を養わないと・・・。 マニュアルをじっとみる→試す→ダメならgoogleさんに聞いてみる→ やさしく解説しているサイトをじっとみる→試す→ダメならもう一度googleさんに聞いてみる→もっとやさしく解説しているサイトをじっとみる→試す→ダメならgooに聞いてみる のような段階を踏んで頂ければ幸いです。

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

関連するQ&A

  • EXISTSについて

    以下のようにしているのですが取得できるデータは1回目のselectのみで2回目のデータが 何度やっても取得できません。 $sql1 = 'SELECT //ここのデータは取得できてます。 products_id, name, products_flag, IF("' . $products->beforedays . '" < DATE(create_date), "1", "0") as new FROM products WHERE EXISTS ( SELECT MIN(price1) as min_price1, MAX(price1) as max_price1, MIN(price2) as min_price2, MAX(price2) as max_price2, stock FROM products_class_detail WHERE //1回目のselectで取得したproducts_idを基準に問い合わせ products_class_detail.products_id = products.products_id ) //ここはproductsに存在するフィールドです。 AND status1 = ? AND status2 = ? AND del_flg = ? ORDER BY RAND()'; マニュアルも見てみたのですが取得できない原因がわからない状態におります。 どうすれば取得可能になるでしょうか?宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • SQL文について

    テーブルにprice1とprice2のフィールドがあります。 単純に安い方から抽出するにはorder by price1でいいのですが price1は通常価格でprice2は特別価格とした場合price1は必ず値が ありますがprice2は任意のものだけ値があります。 price1はもちろんのことprice2は値があるものだけ扱いソートして 抽出するにはどのようなsql文を書けばいいのでしょうか?

    • ベストアンサー
    • PHP
  • SQL文のEXISTSについて

    DBはmysql5.0を使っています。 以下のSQL文を、EXISTSを境に2つに分解することはできないでしょうか?? SELECT ROUND(SUM(IFNULL(T.DAIKIN,0) - IFNULL(T.TESURYO,0))/10000,1) INTO v_PRICE2 FROM TORIHIKI AS T WHERE T.TORIHIKI_KBN = '1' AND EXISTS (SELECT * FROM TORIHIKI AS T2 WHERE T2.TORIHIKI_DATE >= F_DATE AND T2.TORIHIKI_DATE <= T_DATE AND T2.TORIHIKI_KBN = '2' AND T2.KEHAI_CD = LPAD(v_SOBA_CD,5,'0') AND T2.KAIIN_SBT = v_KAIIN AND T.SEIRI_NO = T2.SEIRI_NO AND ROUND((IFNULL(T2.DAIKIN,0) + IFNULL(T2.TESURYO,0))/10000,1) >= p_MIN AND ROUND((IFNULL(T2.DAIKIN,0) + IFNULL(T2.TESURYO,0))/10000,1) < p_MAX );

  • 回答No.1

existsで出来るのでは? // 1回目のsqlで取得したproducts_idを参照し下記のsqlを実行 のSQLをexistsにしてみる。 外してたらごめんなさい。

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/exists-and-not-exists-subqueries.html

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

質問者からのお礼

お返事ありがとうございます。mysqlは始めたばかりでexistsというのも初お目見えです^^; マニュアルを見てみましたが現状のsql中のどこにいれればいいのかわからないのですが 具体的にはどのような形にすればいいのでしょうか? 宜しくお願い致します。

関連するQ&A

  • SQL文のあいまい検索で・・

    初心者ながらの質問ですみません。 いくつか検索条件を入力し、該当するものを取り出したいのですがうまく取れません。 状況として1ユーザーに対して3箇所のカラム(price1,price2,price3)のいずれかに数字が入っており、それの数字に対して*円以上のものという検索をかけたいのです。 現状では select * from テーブル名 where price1>='$price' or price2>='$price' or price3>='$price' という状態なのですが、エラーは出ずに関係ないものまで取ってきてしまう状態です。 どなたかお分かりになる方がいらっしゃいましたら是非ご教授願います。

    • ベストアンサー
    • PHP
  • postgresqlの普通のSQLでデータが取得できません。

    postgresqlの普通のSQLでデータが取得できません。 下記のようなSQLがあります。 SELECT msiten AS kaisyacd,mtokuicd AS tokucd,mchikucd AS chikucd,mchikunm AS chikunm,nmakercd AS makercd,mdealer AS dealercd,mname1 AS name1,mname2 AS name2 FROM msitenmst LEFT JOIN ndealermst ON (mtokuicd = ntokuicd) AND (msitencd = nsiten) WHERE mtokuicd > 100000 (項目名・テーブル名など無理に変更していることをご了承ください。) これをvbaで流すとtokucdの値のみ取得できません。(0になります)他の項目は正しく取得できています。 Accessのクエリで同様のSQLを流しても正しく処理されます。 なぜ、このようなことが有り得るのでしょうか? 非常に困って居ます。 ヒントでもかまいませんので教えていただけないでしょうか? お願いいたします。

  • データをグループ分けするSQLを組みたいのですが

    メンバーを、各人の点数からグループ分けしたいと 考えています。 グループ分けの基準は、たとえば50点という尺度があり、 その尺度以上離れていたら別のグループとするというものです。 また、各メンバーの点数は最大と最小が登録されています。 現在は、VBでプログラムを作って対応しましたが、 最近、LAG/LEAD分析関数の存在を知ったので、それをうまく使えば、 SQLだけで対応できるのではないかと思えます。 SQLだけで対応できると、そのVIEWを作ってしまえば、ユーザーに 簡単に引き渡せるので管理が楽になります。 うまいSQLがあれば教えてください。 具体的な処理内容は以下の通りです。 例えば、TABLE1のようなデータで、グループ分けをすると ID=1と3の差が50点以内、3と2の差も50点以内なので、 その3名で1グループできます。 ID=4と5は、他と50点以上離れているので、それぞれ一人で 1グループになります。 ID= 6,7 は、差が50点以内なので、2名で1グループとなります。 結果として、TABLE2のような結果になります。 TABLE 1 ID MIN_SCORE MAX_SCORE 1 100 110 2 190 200 3 120 150 4 300 330 5 400 420 6 670 700 7 600 630 TABLE 2 CLASS MIN_SCORE MAX_SCORE N 1 100 200 3 2 300 330 1 3 400 420 1 4 600 700 2 そこに、TABLE1'のようなデータが加わると ID=4と8は差が50点以内で、7と8も差が50点以内なので、 そこらが全て同じグループになり TABLE 2' の結果となります。 TABLE 1' 8 380 550 TABLE 2' CLASS MIN_SCORE MAX_SCORE N 1 100 200 3 2 300 700 5 以上、よろしくお願いします

  • SQL文でのデータの取得が上手くいきません

    初めて質問させていただきます。 こちらのカテゴリで良いのか分からなかったのですが、よろしくお願いいたします。 SQL文を作成しているのですが、上手くいかず困っている状況です。 要件としてはテーブルAにユーザーの情報が格納されているのですが、 キーの一つとして世代(SEDAI_NO)(日付)を持っております。 今回取り出したいデータは該当ユーザーの処理日以前の最新のデータを 取得したいと思い以下のSQL文を作成しましたが、上手く行かず、最新世代を含むそれ以前の世代のデータを取得してきています。 どこがおかしいのでしょうか? よろしくお願いいたします。 【作成したSQL】 select * from テーブルA テーブルA’ where (USER_ID=該当のユーザーID) and (SEDAI_NO = (select max(SEDAI_NO) from テーブルA where SEDAI_NO = テーブルA’.SEDAI_NO AND 処理日 >= テーブルA'.SEDAI_NO)

  • SQL文のINNER JOIN内での条件付けについて質問です

    SQLの質問です。 先程も質問させて頂いた件(http://okwave.jp/qa4089307.html)に派生した問題なのですが、 Accessのクエリにて SELECT A.*FROM grade_points AS A INNER JOIN [SELECT MAX(enforcement_date) AS MaxDate,grade_id FROM grade_points WHERE (enforcement_date)<=date() GROUP BY grade_id]. AS B ON (A.grade_id = B.grade_id) AND (A.enforcement_date = B.MaxDate); (前回の件のクエリにWHERE (enforcement_date)<=date() の条件を追加しました) というクエリを作ると、SQLを書いた直後の保存前はちゃんと動くのですが、保存後に閉じてから実行しようとすると「入力テーブルまたはクエリ(上記[]内SQL文)が見つかりません」というエラーになってしまいます。 INNER JOIN内のSQLにWhere条件は使えないのでしょうか??保存前は動くので不思議でなりません… お手数ですがどなたかご意見よろしくお願い致します。

  • SQL文の作成苦戦しています。。

    SQL文の作成で困っております。 有識者の方、ご教授願います。 取得したい情報は、以下の通りです。 HOGEテーブル |COL-A|COL-B|COL-C|   111   1   1 … (1)   111   2   1   111   3   2   222   1   2 … (2)   222   2   3 1.Aでグルーピングした中で、COL-Cの最小値を取得 2.#1の中で一番小さい値を取得 ようするに、(1)や(2)のような情報を取得したいのです。 自分自身で作成したSQLは以下のような感じですが、 ちょっと遅いのです。。。 SELECT COL-A, MIN(COL-B), MIN(COL-C) FROM HOGE1, ( SELECT COL-A, MIN(COL-C) AS COL-C FROM HOGE GROUP BY COL-A ) HOGE2 WHERE HOGE1.COL-A = HOGE2.COL-1 AND HOGE1.COL-C = HOGE2.COL-C GROUP BY COL-A 理由はいろいろあります。ですが、最大の理由は、COL-Cの最小値を取得する為に作成しているサブクエリーじゃないかと思っています。そもそも、HOGEテーブル自体、10万件レベルのテーブルを結合して作っているテーブルなので、VIEWを作ってる時点で遅いんです。それに輪をかけて、サブクエリーなんてものを作っているものだから。。。できるだけ、サブクエリーを避けて取得したいのですが、なかなか上手くいきません。ただ、これ以外の方法は存在しない気もします。。 これ以外の方法で、良い方法があればご教授頂きたく。よろしくお願いします。

  • SQL文について困っています

    ID(NUMBER型)と NUM(NUMBER型)と nenngetu (date型)を持ったテーブルAAAから、 ID=1000 のなかで日時が一番古い処理NOをselectするSQL文を書きましたが上手く実行されません。 select NUM from AAA where nenngetu = (select min(nenngetu) from AAA) and ID=1000; ID=1000の条件をはぶき、 select NUM from AAA where nenngetu = (select min(nenngetu) from AAA); でしたら、実行できました。 oracleで実行しようとしています。 どなたか、書き方を教えてください。

  • SQL文 テーブルの作成方法について

    以下のようなTABLE1からTABLE2というテーブルを作成したいと考えております。 元テーブル(TABLE1)は、IDという項目がキーとなってデータが入っており、NAME1とNAME2という項目があります。 (NAME1は必ず値が入っていますが、NAME2は値が入っていない場合もあります) 加工後のテーブル(TABLE2)で、NAME1とNAME2の値を結合した形で結果を出力したいと考えております。 (新たに作成したNAMEカラムは、必ずしもユニークになっているとは限りません。NAMEとIDを組み合わせるとユニークになります) ---------------------------------------------------- ■ TABLE1 ID NAME1 NAME1_CATE NAME2 NAME2_CATE ---------------------------------------------------- 001 鈴木 A 山田 B 002 山本 A 003 佐藤 A 高橋 B ---------------------------------------------------- ---------------------------------------------------- ■ TABLE2 ID NAME NAME_CATE ---------------------------------------------------- 001 鈴木 A 001 山田 B 002 山本 A 003 佐藤 A 003 高橋 B ・・・ ---------------------------------------------------- いろいろ試していますが、どのようなSQL文を書いたらよいのか分かりません。 現状のSQL(エラーとなります) ====================================================================================== SELECT ID, NAME, NAME_CATE FROM (SELECT ID, NAME1 as NAME, NAME1_CATE as NAME_CATE FROM TABLE1 WHERE NAME1<>NULL) JOIN (SELECT ID, NAME2 as NAME, NAME2_CATE as NAME_CATE FROM TABLE1 WHERE NAME2<>NULL) ====================================================================================== 初歩的な質問になるかと思ってしまうかと思いますが、よろしくお願いいたします。

  • SQL文で困っています。

    ID(NUMBER型)と NUM(NUMBER型)と nenngetu (date型)を持ったテーブルAAAから、 ID=1000 のなかで日時が一番古い処理NOをselectするSQL文を書きましたが上手く実行されません。 select NUM from AAA where nenngetu = (select min(年月) from D_KR_SAP_IFRIREKIKANRI) and ID=1000; ID=1000の条件をはぶき、 select NUM from AAA where nenngetu = (select min(年月) from D_KR_SAP_IFRIREKIKANRI); でしたら、実行できました。 oracleで実行しようとしています。 どなたか、書き方を教えてください。

  • 別テーブルからSELECTした値を持つ行を削除するSQLは?

    削除 SQL がわかりません。 SQL-1 SELECT id FROM table2 WHERE date_in IS NULL; これで取得したidを持つレコード(別テーブル)を削除したいのですが、 どうすれば組み合わさるのでしょうか? DELETE FROM table1 WHERE id=???