MySQLデータ検索クエリについて

このQ&Aのポイント
  • MySQLデータ検索クエリについての質問に対する回答をお願いします。
  • 質問者は、SELECT @num := "abcdef" を実行した際の結果が想定と異なることに悩んでいます。
  • 質問者は、FROMの書式を調べてみたが解決できず、進展がない状況です。
回答を見る
  • ベストアンサー

MySQLデータ検索クエリについて

SELECT @num := "abcdef"; を実行すると +--------+ | @num | +--------+ | abcdef | +--------+ 結果はこうなります。 次に現在悩んでいる事なのですが、 SELECT @num := "abcdef" FROM @num WHERE @num LIKE '%a%'; これを実行すると ERROR 1064 (42000) ~省略~ at line 2 と、なります。 FROMの書式が悪いのかな?と色々と調べ (@num) ("@num") @num := "abcdef" 等々色々当て込めてみ、 SELECT @num := "abcdef" FROM (SELECT @num := "abcdef") WHERE @num LIKE '%a%'; ERROR 1248 (42000): Every derived table must have its own alias line2の書式はクリア?したのですがここから一歩も前に進まない状態です。 特に何に使うという訳ではなく実験的な試みです。 MySQLの仕様だったらそれはそれでスッキリするので投稿させて頂きました。 もしよろしければ回答いただけると幸いです。 よろしくお願いします。

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

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

聞きたい事は SELECT @num := "abcdef" FROM @num WHERE @num LIKE '%a%'; これを実行すると ERROR 1064 (42000) ~省略~ at line 2 と、なりますが、(1)なぜエラーになるのか、(2)ここからどう直せば通るのか、の2点が分からない。 でいいのかな。 まず、これの2行目でエラーが起きるのは「@num」なるテーブルが無いのもさる事ながら、アットマークで始まるテーブル名が識別子として不正だからだ。で、次に SELECT @num := "abcdef" FROM (SELECT @num := "abcdef") WHERE @num LIKE '%a%'; これのエラーは2行目のインラインビューに名前がついていないのが原因。 SELECT @num := "abcdef" FROM (SELECT @num := "abcdef") as numtable WHERE @num LIKE '%a%'; これでOK。さて、この時に3行目の@num LIKE '%a%'がどういう意味になるかだけど、2行目の(SELECT @num := "abcdef")によってabcdefという文字列リテラルが設定された変数@numにaという文字が含まれるかという判定を行う。 @numがSQLの構文うんぬんとは少し離れた場所に居る「MYSQLの変数という概念」である事が分かれば、SQLとどう組み合わせれば良いかというのが分かるかと思う。 で、実行される順番というか@numに出し入れする順番は2行目、3行目、1行目になる。このSQLを見て欲しい。 SELECT @num := "hoge" from (select @num := "fuga") as numtable WHERE @num LIKE '%a%'; まず2行目のインラインビューが実行されて@numにfugaが設定される。次にそのインラインビューのうちどの行を出力するかの判定が3行目で行われ、その時の@numの値はfuga。するとインラインビューの1つ目が出力される事になったので出力しようとするとこのタイミングで1行目の@num := "hoge"が実行され、@numの値がhogeになった後で結果セットを返す事になる。なので、このSQLはhogeが返される。

sosuno20
質問者

お礼

御返答頂きありがとうございました。 大変分かりやすかったです。

関連するQ&A

  • サブクエリでのアップデート(MySQL5.5)

    テーブルに事前に記載された数値を用い、べき乗の数値の挿入(アップデート)をしたいと考えています。 *********************************************** やりたいこと *********************************************** テーブル baken umaban___bekijyo___name 1_______NULL____ HOTARUNOHIKARI 2_______NULL____ MADONOYUKI 3_______NULL____ OPPEKEPE 4_______NULL____ KOTARO これをUPDATEして、bekijyo欄に「2のumaban乗」の数値を挿入する。 umaban___bekijyo___name 1_________2_____ HOTARUNOHIKARI 2_________4_____ MADONOYUKI 3_________8_____ OPPEKEPE 4________16_____ KOTARO ************************************************ まずは、べき乗を求めるために下記のSELECT文を作成したところうまくいきました。 SELECT uma_code,umaban FROM (SELECT POW( 2, umaban ) AS uma_code,umaban FROM cbf_today_baken WHERE umaban<'11') AS temp1 umaban___uma_code___ 1_________2_____ 2_________4_____ 3_________8_____ 4________16_____ あとは、上記の2つをくっ付けるだけです。 UPDATE baken SET bekijyo=(SELECT uma_code FROM (SELECT uma_code,umaban FROM (SELECT POW( 2, umaban ) AS uma_code,umaban FROM cbf_today_baken WHERE umaban<'11') AS temp1) WHERE cbf_today_baken.umaban=temp1.umaban) 上記でアップデート可能と思われましたが、エラーになります。 #1248 - Every derived table must have its own alias どこに誤りがあるのかご教授頂けましたら幸いです。

    • ベストアンサー
    • MySQL
  • LIKE検索の場合うまくいきません

    WEBアプリとSQLServerでSELECTをするときに不正をされないように SELECT * FROM DB WHERE DB.A = 検索文字 を SELECT * FROM DB WHERE DB.A= @A のようにして、@Aを後で指定しますが、 SELECT * FROM DB WHERE LIKE '%検索文字' のようにLIKE検索の場合うまくいきません。 どのように記述したらいいのでしょうか? SELECT * FROM DB WHERE DB.A LIKE @A --> 駄目 SELECT * FROM DB WHERE DB.A LIKE '%@A' --> 駄目

  • mysqlでLIKEで検索について

    KEYIDでKから始まるものを探そうと思っていますが、1件しか表示されず困っております。 ********************************** KEYID(カラム名) K1001 K1002 K1003 select * from テーブル名 Where KEYID LIKE 'K%' [実行結果] K1001 **********************************

    • ベストアンサー
    • MySQL
  • PHP / MySQL / クエリ実行

    【概要】 PHPからMySQLへのクエリを実行したいのですが、結果が返りません。 【環境】 CentOS5 [PHP5] sakuraインターネット レンタルサーバ スタンダートプランです。 参考:http://www.sakura.ne.jp/rentalserver/matrix.html 【ソース PHP】 ------------------------------------------------------------ $query =  mysql_query(' SET @i := 0; SET @ii := 0; SET @iii := 0; SET @iiii := 0; select `sys_no`,`day`,`counter`,(@iiii := @iiii +1)as `counter2` from (select `sys_no`,`name`,`day`,(@i := @i +1) as `counter` from TBL名 ORDER BY `day` DESC ) as aa where counter BETWEEN (select a.counter from (select `sys_no`,`day`,(@ii := @ii +1) as `counter` from TBL名 ORDER BY day DESC ) as a where sys_no =5) - 1 AND (select a.counter from (select `sys_no`,`day`,(@iii := @iii +1) as `counter` from TBL名 ORDER BY day DESC ) as a where sys_no =5) + 1 '); while ($row = mysql_fetch_array($query)) { 結果取得処理 } ------------------------------------------------------------ ・上記をPHPより実行しますと、「while~」の部分で結果が無いとエラーが返ります。 ・phpMyAdminから直接クエリの部分のみを実行しますと、問題無く結果が返ります。 ・なお、クエリを簡単な一行程度の内容にしますと問題無く実行され、結果が返ります。例:select * from TBL名 ・また、上部にセットしている4つのSETを試しに削除した状態でPHPより実行しますと、結果は返りませんがエラーにはなりません。 以上、アドバイス頂戴できますでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • MySQLでのあいまい検索について、教えてください。

    MySQLでのあいまい検索について、教えてください。 長いですが、最後までお付き合いください。 今、入っている全データは、以下の通りです。 fieldはnum,nameです。 1 あいうえお 1 かきくけこA 1 さしすせそB 1 たちつてとC 1 まみむめもF 2 あいうえお 2 かきくけこA 2 さしすせそB 3 わおん 3 らりるれろA 3 たちつてとC 3 なにぬねのD 4 かきくけこA 4 はひふへほE 4 まみむめもF 5 Aあいうえお 6 あいAうえお 7 あい A うえお ここから、あいまい検索でnameに「A」を含むものを抽出したいので、 select num, name from ○○ where name like '%A%' order by num; としました。すると出てくるのは、 1 かきくけこA 1 たちつてとC 1 まみむめもF 2 かきくけこA 3 らりるれろA 3 たちつてとC 4 まみむめもF 4 かきくけこA 5 Aあいうえお 6 あいAうえお 7 あい A うえお が出てきてしまいます。「A」が含まれる物は全て出ますが、それ以外の物まで出ます。 また、「C」で同じことをすると、 1 たちつてとC 3 らりるれろA 3 たちつてとC 「E」では、 3 らりるれろA 3 なにぬねのD 4 はひふへほE 「D」でも別の物が出てきます。しかし「B」「F」は正常に出ます。 他にも、ひらがな「に」でやってみても、 3 らりるれろA 3 なにぬねのD と出ます。 なぜ、このようになってしまうのでしょうか? あいまい検索の仕方を間違っているのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • MYSQLで全てのカラムから検索する。

    tbというテーブルのbangというカラムに4が含まれていれば表示というのは select * from tb where (bang) like '%4%' ; という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。 select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ; と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。 もう少しスマートにする方法はありませんか?

    • ベストアンサー
    • MySQL
  • LIKEを用いたあいまい検索の方法

    SELECT `a2` FROM `a1` , `b1` WHERE a1.a2 LIKE b1.b2; を部分一致で検索したいのですが不可能なのでしょうか? SELECT `a2` FROM `a1` , `b1` WHERE a1.a2 LIKE '%b1.b2%'; とするとエラーは出ないのですが、検索結果が0になってしまうのです。 [開発環境] MySQL 4.0.x a1 b1 +--------+    +------+ | a2    |    | b2   | +-------+    +-------+ | abcde  |    | cd    | +-------+    +-------+ よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • PHP+MySQL

    PHP4で、MySQLに接続しています。 $connには、接続IDが格納されています。 以下のスクリプトで、「エラー」が出てしまうのですが、何故でしょうか? $sql = "SELECT (User_num, User_name, User_pass) FROM User WHERE User_name='$login_name'"; if (!$result= mysql_query($sql, $conn)){ die (print ("エラー")); } SQL文を、 SELECT (User_num) FROM User WHERE User_name='$login_name' と書き換えるとうまくいきます。複数にするとエラーというのはどうしてでしょう

    • ベストアンサー
    • MySQL
  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • mysqlのmatch() against()で検索結果が取得できませ

    mysqlのmatch() against()で検索結果が取得できません。 select * from fulltexttable where match( a ) against( '+ほげ' in boolean mode ) で検索結果は0件ですが、 select * from fulltexttable where a like '%ほげ%' だと検索結果は取得できます。 aカラムにはフルテキストインデックスは貼ってあります。 mysqlのバージョンは5.0.77 hogeテーブルはMyISAM どなたか助けてください。