• ベストアンサー

~JOIN ON句でこのような問い合わせはできるのでしょうか?

SELECT * FROM `テーブル1` AS t1 LEFT JOIN `テーブル2` AS t2 ON ( ( t1.a * 100000 ) + t1.b ) = t2.a エラーはでませんが、意図したレコードが返ってきません。クエリの使い方が間違っているのでしょうか?教えてください。 検証環境:MySQL 4.0.24-standard

  • MySQL
  • 回答数2
  • ありがとう数5

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

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

on 条件の後ろは計算式がはいっていても特に問題ないようですよ。 簡単なデータでやってみると実証できると思います。 >t2のコメントIDは、((t1.group_id*100000 + t1.item_id))と等価です。 みたかんじt1にgroup_idというフィールドがないようですが? 結局は「等価なデータがない」からヒットしないのでは?

blackbrain
質問者

お礼

>on 条件の後ろは計算式がはいっていても特に問題ないようですよ。 まさに知りたかった回答です。インターネットやテキストでは計算式を使った事例がヒットしなかったので。こんなことしていいのかしら?という疑問が先にあって悩んでいました。 >みたかんじt1にgroup_idというフィールドがないようですが? 実際には3~4のテーブルが連結しているので、わかりやすく説明するために…ポカしてしまいました。 >結局は「等価なデータがない」からヒットしないのでは? on 条件の後ろは計算式がはいっていても特に問題ないということですので、そうだと思います。アドバイスを元にクエリを見直したいとおもいます。

その他の回答 (1)

回答No.1

>エラーはでませんが、意図したレコードが返ってきません。 >クエリの使い方が間違っているのでしょうか? この質問内容からは、あなたの意図も、使い方が正しいのかも判断できません。 元の表の列構成と、格納データ例、得たい結果例を示してください。 また、条件式で演算すると、インデクスが利用されず、性能を出せないSQLになります。性能はどうでもいいSQLなのでしょうか?

blackbrain
質問者

補足

ON句の使い方に関する質問なので詳細は省略していたのですが、意味がわかりませんでしたか。すみませんでした。 書籍やサイトで紹介されているような一般的なON句の使い方として、 --------------------- ON テーブル1.ID = テーブル2.ID --------------------- というような使い方やサンプルがありますよね。 ところが、今回は質問にあるような演算式を用いない限り、等価で結びつかないレコードなので、ON句に演算式を用いることができるのかどうかだけ知りたかったのです。 冒頭で書いたような理由がありますが、具体的には テーブル1:商品情報(t1) --------- 1.id:レコード固有のID 2.category_id:カテゴリのID 3.item_id:商品のID(カテゴリごとに1からはじまります) 4.その他のフィールド~ --------- テーブル2:補足情報(t2) --------- 1.id:レコード固有のID 2.comment_id:区分のID((t1.group_id*100000 + t2.item_id)) 3.comment:コメント 4.その他のフィールド~ --------- といったような内容です。t2のコメントIDは、((t1.group_id*100000 + t1.item_id))と等価です。 それぞれ運用実績のあるシステムで管理されているテーブルのため、可能な限り手をいれたくありません。

関連するQ&A

  • 少し複雑な left join

    まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(3行目のleft join)の記述では動かないのですが、どのように 記述したらよいのでしょうか? やりたい内容は3行目にあるようにbookedというテーブルの中のdateが 2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join させたいです。 1 "select * 2 from 3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b 4 on 5 t.start >= b.startTime and t.start < b.finishTime || 6 t.finish > b.startTime and t.finish <= b.finishTime 7 where 8 t.time > 9 (select start 10 from class as c left join member as m 11 on c.className = m.class 12 where m.name = '$name') 13 ) 14 "; よろしくお願いします。

  • MySQLでLEFT JOIN

    MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id

    • ベストアンサー
    • MySQL
  • JOIN句の記述の違いによるパフォーマンスへの影響

    以下のEx1,2のJOIN句の記述方法の違いはクエリのパフォーマンスに影響するのでしょうか? 2万件程度のデータ量で試してみたのですが明確なパフォーマンスの違いを確認できませんでした。(1秒~2秒) 単純に書き方だけの違いであれば心置きなく自分ではわかりやすいと感じているEx1の記述方法で統一したいので。 よろしくお願いします。 -- /* SQL Server 2008 R2 */ -- /* 受注した全ての商品名を取得するクエリ(例) */ -- /* 登場テーブル・カラム */ -- // M_goods 商品マスタ -- // code 商品コード -- // name 商品名 -- // T_orders 受注テーブル -- // number 受注番号 -- // T_orderdetails 受注明細テーブル -- Ex.1 SELECT M_goods.name FROM T_orders LEFT JOIN T_orderdetails ON T_orders.number = T_orderdetails.number LEFT JOIN M_goods ON T_orderdetails.code = M_goods.code -- Ex.2 SELECT M_goods.name FROM T_orders LEFT JOIN T_orderdetails LEFT JOIN M_goods ON T_orderdetails.code = M_goods.code ON T_orders.number = T_orderdetails.number

  • viewでfrom句にサブクエリが書けない

    こんにちは。MYSQLのVIEWの代替についてお教え下さい。 下記でinner joinについて教えて頂きました。 http://okwave.jp/qa/q7296711.html 環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT A.z AS `在庫`,B.* FROM (SELECT SUM(stock) AS z FROM t1 WHERE id='001' GROUP BY id) A INNER JOIN t2 B ON A.id=B.id というコードで、それぞれのテーブルをグループ化してグループ化したもの同士をJOINしました。 このコードを元にVIEWを作り、そのVIEWを対象にクエリを作ろうと考えていました。 しかしながら、MYSQLのVIEWではFROM句でサブクエリは使えませんでした。 http://www.klab.jp/media/mysql/index4.html 上記のコードを書きなおして、なんとしてもVIEWで利用したいのですが、FROM句でサブクエリを使わずにVIEWを作成する方法がわかりません。 どのようにリライトすればよいか、ご助言お願い致します。

    • ベストアンサー
    • MySQL
  • joinの場合のテーブル名の別名の使用方法

    select * from table1 a,table2 b where a.field1=b.field1; とできますが select * from table1 as a left join table2 as b on a.field1=b.field1; とできません。 joinの場合にテーブル名の別名を使う方法を教えてください

  • JOIN 句の書き方について

    毎度お世話になっております。 以下のテーブルの内容があります。 ・テーブル1 フィールド1     a ・テーブル2 フィールド1   親   子   孫     1     a     なし   なし     2    なし    a   なし     3    なし   なし    a     4    なし   なし   なし ここで、テーブル1.フィールド1の内容を含む テーブル2の行を抽出したいのです。 ・希望する結果 フィールド1   親   子   孫    1   a   なし   なし    2   なし   a   なし    3   なし   なし   a 以下のSQL文を作成したところ希望する結果になりましたが、 ONの中にORを書いてもよいのでしょうか。 それともUNIONクエリにすべきなのでしょうか。 SELECT テーブル2.フィールド1, テーブル2.親, テーブル2.子, テーブル2.孫 FROM テーブル1 LEFT JOIN テーブル2 ON (テーブル1.フィールド1 = テーブル2.孫) OR (テーブル1.フィールド1 = テーブル2.子) OR (テーブル1.フィールド1 = テーブル2.親); よろしくお願いします。

  • left join が3つ以上のとき

    例えば select * from ((t1 left join t2 on t1.a=t2.a)left join t3 on t1.a=t3.a) where b.t1='y'; という風にカッコがついて記入しにくくなります。 4つの場合はさらに深刻です。 簡単な記法はないのでしょうか?

  • SQL LEFT JOIN

    SQLでわからないことがあるので質問させていただきます。 例えばの話ですが在庫テーブルというテーブルがあってそこに商品マスタ をLEFT JOINする際に SELECT *  FROM 在庫テーブル LEFT JOIN 商品マスタ ON 品番 = 品番 として実行すると返ってくる結果は在庫テーブルの全レコードと 品番で結んだ商品マスタに存在するデータってことですか? 上記のSQLと SELECT * FROM 在庫テーブル で返ってくるレコード件数が違うという時はどういう可能性が考えられるでしょうか? ちなみに商品マスタの品番レコードはすべてユニークになっていて 色やサイズで品番が複数存在するものではありません。 何回やってもレコード件数が前者のほうが多くなってしまいます。 分かる方がいらしたらぜひ教えていただきたいです。

  • Doctrineのjoinについて

    symfony+Doctrineで開発をしています。 他のプログラムは経験があるもののPHP初心者です。 2つのテーブルをjoinして、両テーブルの結果を取得します。 where句の条件どおりに行数を得られているので、 joinはできていると思います。 でも、結果を取得することが出来ません・・。 具体的には、joinしたテーブル(BTable)のカラムを取得しようとすると、 「Unknown record property / related component "value" on "ATable"」というエラーが出てしまいます。 (ATableにはvalueなんてないよ、って言っているみたいですが) ●ソースはこんな感じ $query = Doctrine_Query::create() ->select('a.name, b.value') ->from('ATable a') ->innerJoin('a.Btable b') ->where('b.id = ?', $id); $list=$query->execute(); foreach($list as $xxx){ print_r($xxx['name']); print_r($xxx['value']);←ここでエラー } ●エラーメッセージ Unknown record property / related component "value" on "ATable" そこで質問させてください。 ・xxx['value']の箇所は、どのように記述すればいいのでしょうか? ・もしくは、Doctrineではjoinしたテーブルの値は取得できないのでしょうか?  (webでいろいろ調べましたが、joinの例はあるものの、select結果を使う、といった例が見つかりませんでした・・) 方法がないのであれば、 あらかじめテーブルをjoinしたviewを作って、 それをselectするようにしようと思っています。 symfony+Doctrineに詳しい方がいらっしゃたら、 よろしくおねがいします。

    • ベストアンサー
    • PHP
  • WHERE句で結合。INNER JOINとの違い

    MySQLで複数テーブルからデータ取得する際、 FROMの後に、テーブル名を2つ書いて、「WHERE」で繋げる書き方と、 「JOIN ★★ ON」で繋げる書き方では、何が違うのでしょうか? ・「INNER JOIN」と同じ意味でしょうか? ・書き方によっては、「LEFT OUTER JOIN」みたいにも書けるのでしょうか? ・普通は、どちらの書き方で書くとか、そういうお作法的な暗黙の了解はあるでしょうか? ・例えば「WHERE」だと3つ以上繋げられない(?)から、奨励されていない、とか…

    • ベストアンサー
    • MySQL