- ベストアンサー
Accessで結果の出るSQLが、MySQLではできなくて困っています
- Accessで結果の出るSQLが、MySQLではできなくて困っています。Linuxサーバー上でデータベースを利用する必要が生じ、MySQLをインストールしたが必要なSELECT検索ができず困っています。MySQLで複数のテーブル/フィールドを結合して値をもとに検索する方法を知りたいです。
- Accessで結果の出るSQLが、MySQLではできない問題に困っています。Linuxサーバー上でデータベースを利用する必要があり、MySQLをインストールしましたが必要なSELECT検索ができず困っています。MySQLで複数のテーブル/フィールドを結合して検索する方法について教えてください。
- Linuxサーバー上でデータベースを利用する必要があり、Accessで結果の出るSQLがMySQLでは実行できません。必要なSELECT検索ができず困っています。MySQLで複数のテーブル/フィールドを結合して検索する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
<例1> SELECT A.id,CONCAT(A.No,COALESCE(B.option1,''),COALESCE(B.option2,'')) AS test FROM A LEFT JOIN B ON A.No=B.No WHERE CONCAT(A.No,COALESCE(B.option1,''),COALESCE(B.option2,''))='01LRED' ; SELECT A.id,CONCAT(A.No,COALESCE(B.option1,''),COALESCE(B.option2,'')) AS test FROM A LEFT JOIN B ON A.No=B.No WHERE CONCAT(A.No,COALESCE(B.option1,''),COALESCE(B.option2,''))='20' ; <例2>インラインビュー(FROM句でのサブクエリ)を使えば、式の別名を条件式で使用可能。 ただし、性能的には推奨できないし、ビュー表で定義できない点に注意 SELECT x.id,test FROM (SELECT A.id,CONCAT(A.No,COALESCE(B.option1,''),COALESCE(B.option2,'')) AS test FROM A LEFT JOIN B ON A.No=B.No) AS x WHERE x.test='01LRED' ; SELECT x.id,test FROM (SELECT A.id,CONCAT(A.No,COALESCE(B.option1,''),COALESCE(B.option2,'')) AS test FROM A LEFT JOIN B ON A.No=B.No) AS x WHERE x.test='20' ; (1)「&」は論理演算であり、MySQLの文字結合はCONCAT関数を使います。 (2)「値なし」がNULLなのか、''(長さ0の文字列)なのかで、単純に結合していいのかどうかが違ってきます。 提示したSQLでは、COALESCE関数でその部分を吸収しています。 (3)提示されたデータやSQLでは、大文字だったり小文字だったり、半角だったり全角だったりしています。 MySQLでは、大文字と小文字を同じ値として扱います。もし区別したいなら、BINARY属性にする必要があります。 半角文字と全角文字は別の値として扱われます。 (4)「'」(単一引用符)、「"」(二重引用符)、「`」(バッククォート)の扱い 「'」(単一引用符)で囲んだものは、文字定数。 「"」(二重引用符)で囲んだものは、MySQLの構文モードにより扱いが違います。 標準SQLやMySQL以外の主要なRDBMSでは、表名や列名が予約語と被る場合や記号を含む場合などに名前を「"」で囲みます。 MySQLでは、インストール時の標準設定では「MySQL構文モード」となり、「"」で囲んだものは文字定数になります。 「ANSIモード」で起動すると、標準SQLと同じく、名前を囲む場合に「"」を使います。 どちらのモードでも、「`」(バッククォート)で囲んだものは、名前として扱われます。
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
Bのoption1とoption2からAのidを抽出するんですよね? であればこんなかんじ・・・ (無駄な文字結合などいりません) LでRedな場合・・・ select id from A inner join B on A.No=B.No AND option1='L' and option2='Red' Lで値なしの場合・・・ select id from A inner join B on A.No=B.No AND option1='L' and option2 is null Bテーブルを作るときにNULLの処理をきちんと定義していないとはまります
お礼
ありがとうございます。 残念な事に、NOとoption1、option2 に分かれていたデータは、結合されて相手に渡り、戻ってくるときは 01LRed や、11S や20 と、ユニークに分割出来ない形で返ってくるため、フィールドを結合して検索するという手段をとらざるをえませんでした…… Accessでは簡単に検索できていたのですが…… ありがとうございました。
- moousi
- ベストアンサー率70% (21/30)
複数のテーブルを結合して、検索することにはまったく問題がありません。 文字列結合の仕方は、Accessと異なります。 文中でもありますように concatを使います。 concat(カラム名1, カラム名2, カラム名3, ・・・・) concat('文字1', '文字2', '文字3', ・・・・) concat(カラム名, '文字1', ・・・・) 使いどころにもよりますが、上記のconcatは有効なものです。 さて、SQLですが、 SELECT A.id, concat(A.No, B.option1, B.option2) AS test FROM A LEFT JOIN B ON A.No = B.No WHERE concat(A.no, B.option1, B.option2) = '01LRED'; これで検索できます。 ご存知かとは思いますが、WHEREの左辺で算術演算子や関数を使わないようにする方が indexを使われる可能性がありますので有利です。 こちらでも同様の結果が求められます。 WHERE a.no='01' AND b.option1='L' AND b.option2='RED';
お礼
ありがとうございます。 01LRED は確かに検索できたので、これでOKか! ……と思ったのですが、20 や 11S では Empty set (0.00 sec) が返って、うまくいきませんでした。 でもかなり助かりました。ありがとうございました。
お礼
ご回答、ありがとうございました。 No1さんも、検索結果が出るところまでは助かりましたが、table B のフィールドに値が無いか、登録そのものが無いデータはひっからないという問題が起こり、困っていたのですが、このSQLでうまくいきました。 Access では、単に & でつなげるだけでOKだったのですが、MySQLはちょっと複雑ですね。 困っていたので助かりました。 ありがとうございます。