• ベストアンサー

サブクエリでLIMITが使用できない件

こんばんは。 サブクエリ内でランダムに5件を対象にしようとLIMITをかけてみたのですが、エラー表示されてしまい、調べてみるとサブクエリでLIMITは使えない、と書かれています(いくつかのサイトでは)。 この場合、最初にLIMITを入れたクエリを実施し、その結果を仮想テーブルのように扱い、それをサブクエリの対象にするしか方法は無いのでしょうか? またその場合「クエリのクエリ」になると思うのですが、 クエリ結果を仮想テーブルとして扱う場合の方法が良くわからず、 そこも教えていただけますと幸いです。 よろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数1

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

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

TEMPORARYに落とせばできそうですよ。 CREATE TEMPORARY TABLE TEMP SELECT data FROM `hoge` ORDER BY RAND() LIMIT 5; SELECT * FROM `fuga` WHERE data in (SELECT data FROM TEMP)

doomdoom
質問者

お礼

yambejpさん ありがとうございます! テンポラリーを生成すると仮想テーブルになるのですね。 試してみましたら、狙ったとおりの結果が表示されました! ありがとうございました!

関連するQ&A

  • サブクエリではかけるのですが、サブクエリを使わないとできません。

    sql文について困っているので質問させてください。 以下のデータがあるとします。 番号  月日   金額 ---------------------------- 1    0512   100 1    0411   200 1    0310   300 2    0609   400 2    0708   500 2    0411   600 3    0523   700 3    0322   800 このデータを番号でグループ化し、 月日が最大のときの金額を取得したいです。 つまり、クエリの実行結果を以下のようにしたいです。 番号  月日   金額 ---------------------------- 1    0512   100 2    0708   500 3    0523   700 この場合、サブクエリを使って書けばほしい結果が得られると思いますが、 mysqlのバージョンが4.0.22なのでサブクエリが使えません。 サブクエリを使わないで上記の結果を得ることはできるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • あるサイトの相関サブクエリの説明について

    いつもお世話になります。 相関サブクエリについて、教えて頂きたいことがあります。 以下のサイトに相関サブクエリについての説明がされています。 http://gihyo.jp/dev/serial/01/sql_academy2/000902 このサイトによると、 ----------------------------------------------------------------- 「行われている動作 リスト2の2つ目のSELECT文においても,最初に評価,実行されるのがサブクエリであるという点は変わりません。・・・」 ※リスト2  相関サブクエリ(性別による集合カット) SELECT * FROM Employees E1 WHERE age = (SELECT MAX(age) FROM Employees E2 WHERE E1.sex = E2.sex); ----------------------------------------------------------------- と説明があります。 理解できないのが、「最初に評価,実行されるのがサブクエリ」という内容です。 私の理解では、相関サブクエリは、内側のクエリが外側のクエリを参照するクエリのことで、まず外側のクエリが実行される。 その後、その結果の各レコードに対してサブクエリを実行していく、というように理解しています。 しかし、上記サイトでは先にサブクエリが実行されるという説明がされており、ちょっと混乱しています。 相関サブクエリは正しくはどういう挙動をするものなのでしょうか、また正しい説明がされているサイトなども教えて頂けないでしょうか。 宜しくお願いします。

  • limit offset はupdate文には使用できないでしょうか?

    MySQL5.1で、500万件あるテーブル a に対し、 100万件ずつ5種類のフラグを付けようと思います。 update a set flg = 1 limit 1000000; まではうまくいったのですが、 update a set flg = 2 limit 1000000,1000000; はSyntaxエラーとなりました。 select で一旦範囲指定し、キーを取得してから UPDATEをかける方法しかないでしょうか?

  • accessのサブクエリ

    Access2003で以下のようなテーブルがあるとします。 [テーブル名:経費TBL] 会社 , 部署 , 年度 , 月 , 経費 ------------------------------- AAA , AAA01 , 2009 , 1 , 10000 AAA , AAA01 , 2009 , 1 , 20000 AAA , AAA01 , 2009 , 2 , 30000 AAA , AAA01 , 2009 , 3 , 40000 BBB , AAA01 , 2009 , 4 , 50000 BBB , AAA01 , 2010 , 1 , 60000 CCC , AAA01 , 2010 , 1 , 70000 CCC , AAA01 , 2010 , 1 , 80000 ここから以下のような、 会社別、部署別の集計データを作成したいとします。 会社 , 部署 , 200901経費計 , 200902経費計 , … , 201012経費計 この時、デザインビューでの条件指定をどうしたら良いのか いまいちよく分かりません。 会社 , 部署, 経費:200901経費計 , 経費:200902経費計… ↑のようにデザインビューで入れて、 経費計のところの条件で IN ( SELECT * FROM 経費TBL WHERE 年度 = 2009 AND 月 = 1 ) みたいに順に入れていけば良いのかと調べながらやっていましたが、 以下のエラーが出てしまいます。 こういう時のデザインビューの記述方法を教えてください。 宜しくお願い致します。 【エラー内容】 「メイン クエリの FROM 句の予約語 EXISTS を使用しないフィールドを 複数返すサブクエリを作成しました。 サブクエリの SELECT ステートメントを変更し、 1 つのフィールドだけを指定してください。(Error 3306)」

  • 複数の条件に該当する結果を、それぞれ2件ずつ取得したい

    こんにちは。 PostgreSQL 7でシステムを開発中ですが、同一テーブルから「列~の値が■のものを2件、列~の値が▲のものを2件、列~の値が●のものを2件、それ以外のものからランダムに2件を取得」したいのですが、実現できなくて困っています。 select * from table where culumn = 'data1' limit 2 union select * from table where culumn = 'data2' limit 2 というようなことなのですが、これでは「limit 2」でparse errorとなってしまいます。 できれば上記のSQL定義でビューを作りたいところなのですが、いい方法はないでしょうか? よろしくお願いします。

  • Nzを使用したサブクエリのLeftJOINのnul

    Access 2016について質問があります。 以下の2つのテーブルがあります テーブル1 ID A B 1 a1 b1 2 a2 b2 3 a3 b3 テーブル2 ID 除外a 除外b 1 a1 (null) 2 (null) b1 テーブル2に対してnullを"*"に変更したサブクエリと テーブル1をLeftJoinで結合するクエリを作成します。 SELECT テーブル1.ID, a, b, Q.除外a, Q.除外b FROM テーブル1 LEFT JOIN (select ID, Nz(テーブル2.除外a,"*") as 除外a,Nz(テーブル2.除外b,"*") as 除外b from テーブル2) AS Q ON テーブル1.ID = Q.ID; 通常、Left Joinで結合する場合、右側のテーブルに存在しないIDは NULLになるはずです。 しかし、サブクエリにNzを使うとなぜか、nullにならず「*」になります。 (ID3の行の除外aと除外bがnullにならずに「*」になる) a b 除外a 除外b a1 b1 a1 * a2 b2 * b1 a3 b3 * * なぜこのようなことが起こるのでしょうか? この現象の回避方法はありますか?

  • サブクエリについてお教え下さい

    サブクエリについてお教え下さい リレーションの事がしっかりわかっていないでおうかがいします。 下記のようなデータがあります。 T_ANIMALとT_SIZEの間にはリレーションがありません。 テーブル名 T_ANIMAL ID,NAME 001,猫 002,犬 003,猿 テーブル名 T_SIZE SIZE_ID,SIZE A,100 B,200 C,300 下記のSQLを実行しましたが、シンタックスエラーと出ました。 Select ID,NAME, (Select SIZE from T_SIZE where SIZE_ID = 'A') from T_ANIMAL 下記のような出力希望結果を出すのは無理なのでしょうか? 出力希望結果 001,猫,100 002,犬,100 003,猿,100 リレーションが無いテーブルから情報を引っ張ってきて表示したいです。 よろしくお願いいたします。 環境はWin 7 HomeとMYSQL5.0です。

    • ベストアンサー
    • MySQL
  • サブクエリ

    見ていただいてありがとうございます。 ただいま、業務で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文は、クエリアナライザで実行すると 正常に終了して結果が返ってきます。 大変困っているので、 どうか宜しくお願いいたします。

  • php mysql で1レコードをランダムに表示させる方法

    プログラム初心者です。 以下、ご指南頂けると幸いです。 データ ----------------------------------------------- id category  txt 1  1     テキスト1 2  1     テキスト2 3  2     テキスト3 4  1     テキスト4 5  1     テキスト5 6  2     テキスト6 上記のようなデータの中から「category」が「1」のレコードをランダムに1つ抽出したいと思っています。 $cat= 1; $query = "SELECT * FROM テーブル名 ORDER BY rand() LIMIT 1 >= (SELECT category = '$cat' FROM テーブル名)"; 上記のスクリプトですとエラーが出てしまいます。 サブクエリの使い方が現状であまり理解していないのだと思います。 本を見たり、検索したりしてるのですがつまづいて、もうかなりの時間が経っているので質問する事にしました。 どうぞ、よろしくお願いします。

    • ベストアンサー
    • PHP
  • クエリで30歳以上の人ランダムに3件抽出したいです。

    Acceess2003のクエリで30歳以上の人からランダムに3件抽出したいです。 下記のSQLだと30歳以上の人は抽出されますが、ランダムな3件が抽出できません。ランダムな3件を抽出するにはどうすればいいでしょうか? ご指導お願いします。 SELECT テーブル1.名前, テーブル1.年齢, テーブル1.備考 FROM テーブル1 WHERE (((テーブル1.年齢)<"30"));